adhdev 0.9.82-rc.387 → 0.9.82-rc.388

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/transports/ipc.ts","../src/tools/chat-compact.ts","../src/tools/mesh-tools-internal.ts","../src/tools/mesh-tool-shared.ts","../src/tools/mesh-session-helpers.ts","../src/tools/mesh-node-identity.ts","../src/tools/mesh-tool-schemas.ts","../src/tools/mesh-compact.ts","../src/tools/mesh-queue-helpers.ts","../src/tools/read-chat-polling-advisory.ts","../src/tools/mesh-tools-status.ts","../src/tools/mesh-tools-queue.ts","../src/tools/mesh-tools-mission.ts","../src/tools/mesh-tools-session.ts","../src/tools/mesh-tools-git.ts","../src/tools/mesh-tools-refine.ts","../src/help.ts","../src/server.ts","../src/transports/local.ts","../src/tools/list-sessions.ts","../src/tools/list-daemons.ts","../src/tools/read-chat.ts","../src/tools/read-chat-debug.ts","../src/tools/spec-debug.ts","../src/tools/send-chat.ts","../src/tools/approve.ts","../src/tools/screenshot.ts","../src/tools/git-status.ts","../src/tools/git-log.ts","../src/tools/git-diff.ts","../src/tools/git-checkpoint.ts","../src/tools/git-push.ts","../src/tools/launch-session.ts","../src/tools/stop-session.ts","../src/tools/check-pending.ts"],"sourcesContent":["/**\n * @adhdev/mcp-server — CLI entry point\n *\n * Usage:\n * npx @adhdev/mcp-server # local mode (localhost:3847)\n * npx @adhdev/mcp-server --port 4000 # custom port\n * npx @adhdev/mcp-server --mode ipc --repo-mesh mesh_xxx # cloud daemon IPC mode\n */\n\nimport { buildMcpHelpText } from './help.js';\nimport { startMcpServer } from './server.js';\n\nexport function parseArgs(argv: string[], env: NodeJS.ProcessEnv = process.env): {\n mode: 'local' | 'ipc';\n port?: number;\n password?: string;\n meshId?: string;\n} {\n const args = argv.slice(2);\n let port: number | undefined;\n let password: string | undefined;\n let meshId: string | undefined;\n let explicitMode: 'local' | 'ipc' | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--mode' && args[i + 1]) {\n const value = String(args[++i]).trim();\n if (value === 'local' || value === 'ipc') explicitMode = value;\n } else if (arg?.startsWith('--mode=')) {\n const value = arg.slice('--mode='.length).trim();\n if (value === 'local' || value === 'ipc') explicitMode = value;\n } else if (arg === '--port' && args[i + 1]) {\n port = Number(args[++i]);\n } else if (arg?.startsWith('--port=')) {\n port = Number(arg.slice('--port='.length));\n } else if (arg === '--password' && args[i + 1]) {\n password = args[++i];\n } else if ((arg === '--repo-mesh' || arg === '--mesh') && args[i + 1]) {\n meshId = args[++i];\n } else if (arg?.startsWith('--repo-mesh=')) {\n meshId = arg.slice('--repo-mesh='.length);\n } else if (arg === '--help' || arg === '-h') {\n printHelp();\n process.exit(0);\n }\n }\n\n // Also accept env vars\n if (!password && env.ADHDEV_PASSWORD) password = env.ADHDEV_PASSWORD;\n if (!meshId && env.ADHDEV_MESH_ID) meshId = env.ADHDEV_MESH_ID;\n if (!explicitMode && env.ADHDEV_MCP_TRANSPORT) {\n const value = env.ADHDEV_MCP_TRANSPORT.trim();\n if (value === 'local' || value === 'ipc') explicitMode = value;\n }\n\n const mode = explicitMode || (meshId && env.ADHDEV_INLINE_MESH ? 'ipc' : 'local');\n return { mode, port, password, meshId };\n}\n\nfunction printHelp(): void {\n console.error(buildMcpHelpText());\n}\n\nstartMcpServer(parseArgs(process.argv)).catch((err) => {\n process.stderr.write(`[adhdev-mcp] Fatal: ${err?.message ?? err}\\n`);\n process.exit(1);\n});\n","/**\n * IpcTransport — WebSocket client for the cloud daemon's local IPC server.\n *\n * This is used by Repo Mesh coordinators launched by `adhdev daemon` (cloud\n * daemon). They run on the same machine as the daemon, but not against the\n * standalone HTTP server at localhost:3847.\n *\n * Uses a persistent connection pool (one WS per port+path) so concurrent\n * mesh tool calls share a single connection instead of opening a new socket\n * per request.\n */\n\nconst DEFAULT_IPC_PORT = 19222;\nconst DEFAULT_IPC_PATH = '/ipc';\nconst DEFAULT_IPC_COMMAND_TIMEOUT_MS = 15_000;\n// IPC (layer-1) is the OUTERMOST deadline. For a REMOTE node the coordinator wraps\n// the verb in `mesh_relay_command` (120s here), so getTimeoutMs() already covers the\n// relay/responder budget. But for a LOCAL node commandForNode() sends the BARE verb\n// (transport.command), so the only deadline is this table — and any heavy verb missing\n// an entry fell back to the 15s default and false-timed-out while the responder was\n// still working (e.g. a local `clone_mesh_node` worktree create). Entries below keep\n// IPC ≥ the relay budget (daemon-cloud resultTimeoutForCommand) ≥ the responder budget.\nconst IPC_COMMAND_TIMEOUTS_MS: Record<string, number> = {\n mesh_relay_command: 120_000,\n agent_command: 30_000,\n git_status: 45_000,\n git_diff_summary: 45_000,\n fast_forward_mesh_node: 120_000,\n mesh_status: 120_000,\n // Heavy repo-mutating worktree ops (relay budgets: clone 90s, remove 60s). A local\n // clone synchronously creates a worktree (~30s) plus a bounded setup-wait (~14s);\n // 120s leaves headroom and matches the relay-wrapped remote path.\n clone_mesh_node: 120_000,\n remove_mesh_node: 60_000,\n // A5: plan_mesh_refine_node is the SYNCHRONOUS refine dry-run — it runs several git\n // probes (status/merge-tree/submodule) inline before replying, which can approach the\n // 15s default on a slow (Windows) host. 45s defensively, matching git_status/diff.\n plan_mesh_refine_node: 45_000,\n // A2: refine_mesh_node / batch_refine_mesh_nodes are async-job-ack (the responder\n // returns { async:true, status:'accepted' } immediately and works in the background),\n // so 15s already suffices. 30s is a defensive floor guarding a future sync-dry-run\n // regression; it is intentionally BELOW the relay 90s budget because the synchronous\n // ack reply is sub-second and never bounded by the relay deadline.\n refine_mesh_node: 30_000,\n batch_refine_mesh_nodes: 30_000,\n};\n\n// WS readyState constants (same as browser)\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst POOL_IDLE_EVICT_MS = 5 * 60_000; // evict connections idle for >5 min\nconst POOL_MAX_AGE_MS = 10 * 60_000; // force-refresh connections older than 10 min\n\ninterface PooledConnection {\n ws: WebSocket;\n ready: boolean;\n commandQueue: Array<{ type: string; args: Record<string, unknown>; requestId: string }>;\n pending: Map<string, PendingRequest>;\n lastUsedAt: number;\n createdAt: number;\n}\n\nconst connectionPool = new Map<string, PooledConnection>();\n\nfunction buildRequestId(): string {\n return `mcp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function getTimeoutMs(type: string, nestedCommand: string): number {\n return Math.max(\n IPC_COMMAND_TIMEOUTS_MS[type] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\n IPC_COMMAND_TIMEOUTS_MS[nestedCommand] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\n );\n}\n\nfunction getOrCreateConnection(\n WebSocketCtor: typeof WebSocket,\n url: string,\n): PooledConnection {\n const existing = connectionPool.get(url);\n if (existing) {\n const { readyState } = existing.ws;\n const now = Date.now();\n const isAlive = readyState === WS_CONNECTING || readyState === WS_OPEN;\n const isIdle = now - existing.lastUsedAt > POOL_IDLE_EVICT_MS && existing.pending.size === 0;\n const isTooOld = now - existing.createdAt > POOL_MAX_AGE_MS && existing.pending.size === 0;\n if (isAlive && !isIdle && !isTooOld) {\n return existing;\n }\n if (isAlive && (isIdle || isTooOld)) {\n try { existing.ws.close(); } catch { /* noop */ }\n connectionPool.delete(url);\n }\n // Stale — remove and recreate\n connectionPool.delete(url);\n }\n\n const now = Date.now();\n const conn: PooledConnection = {\n ws: new WebSocketCtor(url),\n ready: false,\n commandQueue: [],\n pending: new Map(),\n lastUsedAt: now,\n createdAt: now,\n };\n connectionPool.set(url, conn);\n\n const drainQueue = () => {\n conn.ready = true;\n for (const { type, args, requestId } of conn.commandQueue) {\n conn.ws.send(JSON.stringify({ type: 'ext:command', payload: { command: type, args, requestId } }));\n }\n conn.commandQueue = [];\n };\n\n let tornDown = false;\n const teardown = (error: Error) => {\n if (tornDown) return;\n tornDown = true;\n connectionPool.delete(url);\n conn.ready = false;\n for (const [, req] of conn.pending) {\n clearTimeout(req.timer);\n req.reject(error);\n }\n conn.pending.clear();\n conn.commandQueue = [];\n };\n\n conn.ws.addEventListener('open', () => {\n conn.ws.send(JSON.stringify({\n type: 'ext:register',\n payload: {\n ideType: 'mcp-server',\n ideVersion: '1.0.0',\n extensionVersion: '1.0.0',\n instanceId: `mcp-server-${process.pid}`,\n machineId: 'mcp-server',\n workspaceFolders: [],\n },\n }));\n });\n\n conn.ws.addEventListener('message', (event: MessageEvent) => {\n try {\n const raw = typeof event.data === 'string' ? event.data : String(event.data);\n const msg = JSON.parse(raw);\n if (msg?.type === 'daemon:welcome') {\n drainQueue();\n return;\n }\n if (msg?.type !== 'ext:command_result') return;\n const req = conn.pending.get(msg?.payload?.requestId);\n if (!req) return;\n conn.pending.delete(msg.payload.requestId);\n clearTimeout(req.timer);\n const payload = msg.payload;\n if (payload?.success === false) {\n req.reject(new Error(payload.error || 'Daemon IPC command failed'));\n } else {\n req.resolve(payload?.result ?? payload);\n }\n } catch {\n // Ignore non-JSON or unrelated daemon messages.\n }\n });\n\n conn.ws.addEventListener('error', () => {\n teardown(new Error(`Cannot connect to daemon IPC at ${url}`));\n });\n\n conn.ws.addEventListener('close', () => {\n teardown(new Error(`Daemon IPC connection closed: ${url}`));\n });\n\n return conn;\n}\n\nexport interface IpcTransportOptions {\n port?: number;\n path?: string;\n}\n\nexport class IpcTransport {\n private port: number;\n private path: string;\n\n constructor(opts: IpcTransportOptions = {}) {\n this.port = opts.port ?? DEFAULT_IPC_PORT;\n this.path = opts.path || DEFAULT_IPC_PATH;\n }\n\n async ping(): Promise<boolean> {\n try {\n const res = await fetch(`http://127.0.0.1:${this.port}/health`);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n async getStatus(): Promise<any> {\n return this.command('get_status_metadata');\n }\n\n async command(type: string, args: Record<string, unknown> = {}): Promise<any> {\n return this.sendIpcCommand(type, args);\n }\n\n async meshCommand(\n targetDaemonId: string,\n command: string,\n args: Record<string, unknown> = {},\n ): Promise<any> {\n return this.sendIpcCommand('mesh_relay_command', {\n targetDaemonId,\n command,\n args,\n });\n }\n\n private sendIpcCommand(type: string, args: Record<string, unknown>): Promise<any> {\n const WebSocketCtor = globalThis.WebSocket;\n if (!WebSocketCtor) {\n return Promise.reject(new Error('WebSocket is not available in this Node runtime; Node 20+ is required for daemon IPC mode'));\n }\n\n const requestId = buildRequestId();\n const nestedCommand = typeof args?.command === 'string' ? args.command : '';\n const timeoutMs = getTimeoutMs(type, nestedCommand);\n const targetDaemonId = typeof args?.targetDaemonId === 'string' ? args.targetDaemonId : '';\n\n const diagnosticParts = [\n `command='${type}'`,\n ...(nestedCommand ? [`relayedCommand='${nestedCommand}'`] : []),\n ...(targetDaemonId ? [`targetDaemonId='${targetDaemonId.slice(0, 12)}'`] : []),\n ...(typeof args?.nodeId === 'string' ? [`nodeId='${args.nodeId}'`] : []),\n ...(typeof args?.workspace === 'string' ? [`workspace='${args.workspace}'`] : []),\n ];\n\n const url = `ws://127.0.0.1:${this.port}${this.path}`;\n\n return new Promise((resolve, reject) => {\n let conn: PooledConnection;\n try {\n conn = getOrCreateConnection(WebSocketCtor as typeof WebSocket, url);\n } catch (e: any) {\n return reject(new Error(`Failed to create IPC connection: ${e?.message || e}`));\n }\n\n const timer = setTimeout(() => {\n conn.pending.delete(requestId);\n reject(new Error(`Daemon IPC ${diagnosticParts.join(' ')} timed out after ${Math.round(timeoutMs / 1000)}s (requestId=${requestId})`));\n }, timeoutMs);\n\n conn.pending.set(requestId, { resolve, reject, timer });\n conn.lastUsedAt = Date.now();\n\n if (conn.ready) {\n conn.ws.send(JSON.stringify({ type: 'ext:command', payload: { command: type, args, requestId } }));\n } else {\n conn.commandQueue.push({ type, args, requestId });\n }\n });\n }\n}\n","export type CompactChatMessage = Record<string, any>;\n\nexport function messageContent(message: any): string {\n const content = message?.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content.map((part: any) => (typeof part === 'string' ? part : part?.text ?? '')).join('');\n }\n return '';\n}\n\nexport function isCoordinatorVisibleMessage(message: any): boolean {\n if (!message || typeof message !== 'object') return false;\n const role = String(message.role ?? '').toLowerCase();\n if (role === 'tool' || role === 'system' || role === 'debug') return false;\n const kind = String(message.kind ?? message.type ?? message.messageKind ?? '').toLowerCase();\n if (['tool', 'tool_call', 'tool_result', 'terminal', 'internal', 'control', 'debug', 'status'].includes(kind)) return false;\n const meta = message.meta ?? message.metadata;\n if (meta?.internal === true || meta?.debug === true || meta?.control === true || meta?.userVisible === false || meta?.user_visible === false) return false;\n return role === 'user' || role === 'assistant' || role === 'agent';\n}\n\n/**\n * Build a one-line summary string for a tool/bash message that was filtered out.\n * Returns null when no useful summary can be extracted.\n */\nexport function summarizeToolMessage(message: any): string | null {\n if (!message || typeof message !== 'object') return null;\n const kind = String(message.kind ?? message.type ?? message.messageKind ?? '').toLowerCase();\n const role = String(message.role ?? '').toLowerCase();\n\n // Bash / terminal execution\n if (kind === 'terminal' || kind === 'bash') {\n const cmd = message.command ?? message.cmd ?? message.input ?? messageContent(message);\n const exit = message.exitCode ?? message.exit_code ?? message.code;\n const cmdShort = typeof cmd === 'string' ? cmd.split('\\n')[0].slice(0, 120) : null;\n if (!cmdShort) return null;\n return exit !== undefined && exit !== null ? `[Bash] ${cmdShort} → exit ${exit}` : `[Bash] ${cmdShort}`;\n }\n\n // Tool call (Claude-style function call)\n if (kind === 'tool_call' || kind === 'tool' || role === 'tool') {\n const name = message.name ?? message.toolName ?? message.tool_name ?? message.function?.name;\n if (typeof name === 'string' && name.trim()) return `[Tool] ${name.trim()}`;\n return null;\n }\n\n // Tool result with explicit exit code\n if (kind === 'tool_result') {\n const exit = message.exitCode ?? message.exit_code ?? message.code;\n const name = message.name ?? message.toolName ?? message.tool_name;\n const label = typeof name === 'string' && name.trim() ? name.trim() : 'tool';\n return exit !== undefined && exit !== null ? `[Tool result: ${label}] exit ${exit}` : null;\n }\n\n return null;\n}\n\nexport function buildCompactMessageTail(\n visibleMessages: CompactChatMessage[],\n opts: { summary?: string; finalAssistant?: CompactChatMessage | undefined; limit: number },\n): CompactChatMessage[] {\n const tail = visibleMessages.slice(-opts.limit);\n // Always include the final assistant message even if it falls outside the tail window.\n if (opts.finalAssistant && !tail.includes(opts.finalAssistant)) {\n return [opts.finalAssistant, ...tail];\n }\n return tail;\n}\n\n/**\n * Normalize message text for an equality check between the compact `summary`\n * field and a message bubble's content. Trims and collapses interior whitespace\n * so trivially-different copies of the same report compare equal.\n */\nfunction normalizeForSummaryEquality(value: string): string {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * When compact mode lifts the final assistant bubble into the `summary` field,\n * the same report text would otherwise be serialized a SECOND time inside the\n * returned `messages[]` tail — exactly doubling the payload for long reports.\n * This rewrites any tail bubble whose content is substantively identical to the\n * summary into a content-free stub carrying `_sameAsSummary: true`, so the body\n * lives exactly once (in `summary`). Bubble position/role/timestamp are preserved\n * for callers that walk the tail; the body is recoverable from `summary`.\n */\nexport function dedupeSummaryFromTail(\n messages: CompactChatMessage[],\n summary: string | undefined,\n): CompactChatMessage[] {\n const normalizedSummary = summary ? normalizeForSummaryEquality(summary) : '';\n if (!normalizedSummary) return messages;\n return messages.map((message) => {\n const role = String(message?.role ?? '').toLowerCase();\n if (role !== 'assistant' && role !== 'agent') return message;\n const content = messageContent(message);\n if (!content.trim()) return message;\n if (normalizeForSummaryEquality(content) !== normalizedSummary) return message;\n const { content: _omitted, ...rest } = message;\n return { ...rest, content: '', _sameAsSummary: true };\n });\n}\n\nexport function compactChatPayload(\n payload: any,\n opts: { sessionId?: string | null; nodeId?: string; limit?: number } = {},\n): any {\n const rawMessages = Array.isArray(payload?.messages) ? payload.messages : [];\n const visible = rawMessages.filter(isCoordinatorVisibleMessage);\n const limit = Math.max(1, Math.min(opts.limit ?? 10, 10));\n const finalAssistant = [...visible].reverse().find((message: any) => {\n const role = String(message?.role ?? '').toLowerCase();\n return (role === 'assistant' || role === 'agent') && messageContent(message).trim();\n });\n const summary = typeof payload?.summary === 'string' && payload.summary.trim()\n ? payload.summary.trim()\n : messageContent(finalAssistant).trim();\n // The final assistant bubble is now lifted into `summary`; strip its duplicate\n // body from the tail so a long report isn't serialized twice (leak #1).\n const messages = dedupeSummaryFromTail(\n buildCompactMessageTail(visible, { summary, finalAssistant, limit }),\n summary,\n );\n\n // Collect one-line summaries for filtered-out tool/bash messages so the coordinator\n // can see what actions were taken without reading the full transcript.\n const toolSummaries = rawMessages\n .filter((m: any) => !isCoordinatorVisibleMessage(m))\n .map(summarizeToolMessage)\n .filter((s: string | null): s is string => s !== null);\n\n // omittedMessages = total messages not included in the returned `messages` tail.\n // This includes both filtered (tool/system) messages AND visible messages cut off by the tail limit.\n const omittedMessages = Math.max(0, rawMessages.length - messages.length);\n // filteredMessages = only the non-user-visible messages (for backward compat).\n const filteredMessages = Math.max(0, rawMessages.length - visible.length);\n\n return {\n success: payload?.success !== false,\n compact: true,\n ...(opts.nodeId ? { nodeId: opts.nodeId } : {}),\n ...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}),\n status: payload?.status ?? null,\n providerSessionId: payload?.providerSessionId ?? null,\n totalMessages: rawMessages.length,\n visibleMessages: visible.length,\n filteredMessages,\n omittedMessages,\n ...(toolSummaries.length > 0 ? { toolSummaries } : {}),\n summary,\n ...(payload?.changedFiles !== undefined ? { changedFiles: payload.changedFiles } : {}),\n ...(payload?.testsRun !== undefined ? { testsRun: payload.testsRun } : {}),\n messages,\n };\n}\n","/**\n * Mesh Tools — Mesh-scoped coordinator tools for Repo Mesh orchestration\n *\n * These tools wrap existing MCP transport operations but restrict targets\n * to mesh member nodes only. The coordinator uses these to delegate work\n * to agents across the mesh via natural conversation.\n *\n * 29 tools: mesh_status, mesh_mission_upsert, mesh_mission_list, mesh_list_nodes, mesh_enqueue_task, mesh_view_queue,\n * mesh_queue_cancel, mesh_queue_requeue, mesh_send_task, mesh_read_chat,\n * mesh_read_debug, mesh_launch_session, mesh_git_status,\n * mesh_fast_forward_node, mesh_checkpoint, mesh_approve,\n * mesh_clone_node, mesh_remove_node, mesh_refine_node,\n * mesh_refine_config_schema, mesh_validate_refine_config,\n * mesh_suggest_refine_config, mesh_refine_plan,\n * mesh_cleanup_sessions, mesh_task_history, mesh_reconcile_ledger,\n * mesh_review_inbox\n */\n\n// ─── Internal module ───────────────────────────\n// Shared helpers, types, module-level state, and dependency re-exports for the mesh tool\n// domain files (mesh-tools-{status,queue,mission,session,git,refine}.ts). Split out of\n// mesh-tools.ts as a pure move — no behavior change. mesh-tools.ts is now a re-export barrel.\n\nimport { randomUUID } from 'node:crypto';\nimport { IpcTransport } from '../transports/ipc.js';\nimport type { CommandTransport } from '../transports/mode.js';\nimport { compactChatPayload, isCoordinatorVisibleMessage, messageContent } from './chat-compact.js';\nimport { annotateRapidReadChatAdvisory } from './read-chat-polling-advisory.js';\nimport type { LocalMeshEntry, LocalMeshNodeEntry, MeshActiveWorkSummary, RepoMeshPolicy, RepoMeshRelatedRepo } from '@adhdev/daemon-core';\nimport {\n daemonIdsEquivalent,\n meshNodeIdMatches,\n appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n summarizeMeshAsyncRefineJobs,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildMeshNodeCapabilityTags,\n buildMeshNodeProbeFreshness,\n buildMeshSchedulingRuntime,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n pruneStaleDirectDispatches,\n describeTaskDependencyState,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n computeMeshMissionStats,\n computeMeshTaskStats,\n getActiveMeshMissionSummaries,\n getMeshStatusMissionSummaries,\n getMeshStatusMissionsCompact,\n listMeshMissionSummaries,\n MESH_MISSION_STATUSES,\n upsertMeshMission,\n getActiveDirectDispatches,\n getQueue,\n getLedgerSummary,\n getSessionRecoveryContext,\n insertDirectDispatch,\n recordDirectDispatchTask,\n isP2pRelayTransportFailure,\n markStaleDirectDispatches,\n nodeSatisfiesRequiredTags,\n normalizeMeshCapabilityTags,\n readLedgerEntries,\n readLedgerSlice,\n readLedgerSliceFromStore,\n reconcileDirectDispatchCompletionFromTranscript,\n recordMeshToolCall,\n requeueTask,\n resolveMeshSurfacedSessionPreview,\n resolveDelegatedWorkerAutoApprove,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\nimport { readString, readNumeric, LARGE_LEDGER_FIELD_KEYS, summarizeLargeLedgerField, elideLargeNestedValue } from './mesh-tool-shared.js';\nimport {\n readSessionRecordId,\n extractStatusMetadataSessions,\n resolveSessionProviderType,\n isMeshCoordinatorSessionRecord,\n isUnmanagedSessionRecord,\n isWorkerTaskMode,\n collectNodeSessionIds,\n unwrapCommandPayload,\n isTerminalSessionRecord,\n isIdleSessionRecord,\n} from './mesh-session-helpers.js';\nimport {\n ACTIVE_QUEUE_STATUSES,\n HISTORICAL_QUEUE_STATUSES,\n COMPACT_MAX_ACTIVE_QUEUE_ROWS,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n buildQueueStatusSummary,\n normalizeQueueViewMode,\n sanitizeQueueStatusFilter,\n filterQueueForView,\n prioritizeActiveQueueRows,\n buildQueueMaintenanceReport,\n buildCompactQueueMaintenanceReport,\n compactQueueRow,\n compactQueueRows,\n compactActiveWorkRecords,\n annotateQueueStaleness,\n} from './mesh-queue-helpers.js';\nimport type { QueueViewMode } from './mesh-queue-helpers.js';\nimport {\n compactMeshStatusNode,\n compactNodeSeverity,\n isNoteworthyCompactNode,\n minimalCompactNode,\n summarizeNodeSessions,\n} from './mesh-compact.js';\n\n// Node identity / locality helpers were physically moved to ./mesh-node-identity.ts\n// (pure move, no behavior change). Imported back for internal use here.\nimport {\n resolveCoordinatorNode,\n resolveCoordinatorDaemonId,\n readNodeMachineId,\n readNodeDaemonId,\n buildNodeMachineIdentity,\n resolvePreferredWorktreeNodeId,\n isLocalControlPlaneNode,\n} from './mesh-node-identity.js';\n\n// Re-exported so the public `./tools/mesh-tools.js` path still exposes it.\nexport { resolveCoordinatorDaemonId } from './mesh-node-identity.js';\n\n\n// ─── Tool Definitions ───────────────────────────\n\n// Tool schema definitions live in ./mesh-tool-schemas.ts. Re-exported here so the\n// public `./tools/mesh-tools.js` import path (server.ts, help.ts) is unchanged.\nexport {\n MESH_STATUS_TOOL,\n MESH_LIST_NODES_TOOL,\n MESH_ENQUEUE_TASK_TOOL,\n MESH_VIEW_QUEUE_TOOL,\n MESH_QUEUE_CANCEL_TOOL,\n MESH_QUEUE_REQUEUE_TOOL,\n MESH_SEND_TASK_TOOL,\n MESH_READ_CHAT_TOOL,\n MESH_READ_DEBUG_TOOL,\n MESH_LAUNCH_SESSION_TOOL,\n MESH_GIT_STATUS_TOOL,\n MESH_READ_NODE_LOGS_TOOL,\n MESH_FAST_FORWARD_NODE_TOOL,\n MESH_RESTART_DAEMON_TOOL,\n MESH_CHECKPOINT_TOOL,\n MESH_MISSION_UPSERT_TOOL,\n MESH_MISSION_LIST_TOOL,\n MESH_APPROVE_TOOL,\n MESH_CLONE_NODE_TOOL,\n MESH_REMOVE_NODE_TOOL,\n MESH_CLEANUP_SESSIONS_TOOL,\n MESH_TASK_HISTORY_TOOL,\n MESH_RECORD_NOTE_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n MESH_PRUNE_STALE_DIRECT_TOOL,\n MESH_REFINE_NODE_TOOL,\n MESH_REFINE_BATCH_TOOL,\n MESH_REFINE_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_REFINE_CONFIG_TOOL,\n MESH_SUGGEST_REFINE_CONFIG_TOOL,\n MESH_CHANGE_IMPACT_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_SUGGEST_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_INIT_TOOL,\n MESH_REFINE_PLAN_TOOL,\n MESH_REVIEW_INBOX_TOOL,\n ALL_MESH_TOOLS,\n} from './mesh-tool-schemas.js';\n\n// Re-export imported dependencies so the domain tool files import everything from this module.\nexport {\n IpcTransport,\n} from '../transports/ipc.js';\nexport type {\n CommandTransport,\n} from '../transports/mode.js';\nexport {\n compactChatPayload,\n isCoordinatorVisibleMessage,\n messageContent,\n} from './chat-compact.js';\nexport {\n compactMeshStatusNode,\n compactNodeSeverity,\n isNoteworthyCompactNode,\n minimalCompactNode,\n summarizeNodeSessions,\n} from './mesh-compact.js';\nexport {\n buildNodeMachineIdentity,\n isLocalControlPlaneNode,\n readNodeDaemonId,\n readNodeMachineId,\n resolveCoordinatorNode,\n resolvePreferredWorktreeNodeId,\n} from './mesh-node-identity.js';\nexport {\n ACTIVE_QUEUE_STATUSES,\n COMPACT_MAX_ACTIVE_QUEUE_ROWS,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n HISTORICAL_QUEUE_STATUSES,\n annotateQueueStaleness,\n buildCompactQueueMaintenanceReport,\n buildQueueMaintenanceReport,\n buildQueueStatusSummary,\n compactActiveWorkRecords,\n compactQueueRow,\n compactQueueRows,\n filterQueueForView,\n normalizeQueueViewMode,\n prioritizeActiveQueueRows,\n sanitizeQueueStatusFilter,\n} from './mesh-queue-helpers.js';\nexport type {\n QueueViewMode,\n} from './mesh-queue-helpers.js';\nexport {\n collectNodeSessionIds,\n extractStatusMetadataSessions,\n isIdleSessionRecord,\n isMeshCoordinatorSessionRecord,\n isTerminalSessionRecord,\n isUnmanagedSessionRecord,\n isWorkerTaskMode,\n readSessionRecordId,\n resolveSessionProviderType,\n unwrapCommandPayload,\n} from './mesh-session-helpers.js';\nexport {\n LARGE_LEDGER_FIELD_KEYS,\n elideLargeNestedValue,\n readNumeric,\n readString,\n summarizeLargeLedgerField,\n} from './mesh-tool-shared.js';\nexport {\n annotateRapidReadChatAdvisory,\n} from './read-chat-polling-advisory.js';\nexport {\n MESH_MISSION_STATUSES,\n appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildMeshNodeCapabilityTags,\n buildMeshNodeProbeFreshness,\n buildMeshSchedulingRuntime,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n computeMeshMissionStats,\n computeMeshTaskStats,\n daemonIdsEquivalent,\n describeTaskDependencyState,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n getActiveDirectDispatches,\n getActiveMeshMissionSummaries,\n getLedgerSummary,\n getMeshStatusMissionSummaries,\n getMeshStatusMissionsCompact,\n getQueue,\n getSessionRecoveryContext,\n insertDirectDispatch,\n isP2pRelayTransportFailure,\n listMeshMissionSummaries,\n markStaleDirectDispatches,\n meshNodeIdMatches,\n nodeSatisfiesRequiredTags,\n normalizeMeshCapabilityTags,\n pruneStaleDirectDispatches,\n readLedgerEntries,\n readLedgerSlice,\n readLedgerSliceFromStore,\n reconcileDirectDispatchCompletionFromTranscript,\n recordDirectDispatchTask,\n recordMeshToolCall,\n requeueTask,\n resolveDelegatedWorkerAutoApprove,\n resolveMeshSurfacedSessionPreview,\n summarizeMeshAsyncRefineJobs,\n upsertMeshMission,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\nexport type {\n LocalMeshEntry,\n LocalMeshNodeEntry,\n MeshActiveWorkSummary,\n MeshSchedulingRuntime,\n MeshNodeSchedulingRuntime,\n RepoMeshPolicy,\n RepoMeshRelatedRepo,\n} from '@adhdev/daemon-core';\nexport {\n randomUUID,\n} from 'node:crypto';\n\nexport interface MeshContext {\n mesh: LocalMeshEntry;\n transport: CommandTransport;\n /** Daemon ID for this local machine (local mode) */\n localDaemonId?: string;\n /** Machine Registry ID for this local machine */\n localMachineId?: string;\n /** Hostname of the daemon/MCP coordinator machine. */\n coordinatorHostname?: string;\n /**\n * Runtime session id of THIS coordinator's CLI session, injected by the daemon at\n * coordinator launch via ADHDEV_COORDINATOR_SESSION_ID. Stamped onto dispatched\n * workers (meshContext.coordinatorSessionId) so a worker's completion event routes\n * back to the exact originating coordinator session — even when several coordinator\n * sessions share one daemon. Absent for non-coordinator / legacy launches → routing\n * falls back to the daemon-level anchor.\n */\n coordinatorSessionId?: string;\n}\n\nexport type MeshSessionProviderMetadata = {\n providerType: string;\n providerSessionId?: string;\n};\n\nexport const SESSION_PROVIDER_METADATA_TTL_MS = 30 * 60_000;\n\nexport type TimestampedSessionMetadata = MeshSessionProviderMetadata & { expiresAt: number };\n\nexport const meshSessionProviderMetadata = new Map<string, TimestampedSessionMetadata>();\n\nexport function getSessionMetadata(key: string): MeshSessionProviderMetadata | undefined {\n const entry = meshSessionProviderMetadata.get(key);\n if (!entry) return undefined;\n if (entry.expiresAt <= Date.now()) {\n meshSessionProviderMetadata.delete(key);\n return undefined;\n }\n return entry;\n}\n\nexport const ACTIVE_WORK_POLLING_BACKOFF_MS = 60_000;\n\nexport interface MeshPollingGuidance {\n activeGeneratingWork: true;\n generatingCount: number;\n doNotPollBefore: string;\n eventSurface: 'pendingCoordinatorEvents';\n nextRecommendedAction: string;\n message: string;\n}\n\nexport function buildActiveWorkPollingGuidance(summary: MeshActiveWorkSummary, now = Date.now()): MeshPollingGuidance | undefined {\n if (!summary || summary.generatingCount <= 0) return undefined;\n return {\n activeGeneratingWork: true,\n generatingCount: summary.generatingCount,\n doNotPollBefore: new Date(now + ACTIVE_WORK_POLLING_BACKOFF_MS).toISOString(),\n eventSurface: 'pendingCoordinatorEvents',\n nextRecommendedAction: 'Wait for pendingCoordinatorEvents/completion events or an explicit user status request. If no terminal evidence appears and the user asks for status, make one bounded status check, then wait again.',\n message: 'Do not repeatedly poll mesh_status/mesh_view_queue/mesh_read_chat while delegated work is generating; terminal ledger or completion evidence will be surfaced through pendingCoordinatorEvents when available.',\n };\n}\n\n\n// ─── Helpers ────────────────────────────────────\n\nexport function summarizeTaskMessage(message: string): { taskTitle: string; taskSummary: string } {\n const taskSummary = message.replace(/\\s+/g, ' ').trim();\n const taskTitle = taskSummary.length > 96 ? `${taskSummary.slice(0, 93)}...` : taskSummary;\n return { taskTitle: taskTitle || '(untitled task)', taskSummary };\n}\n\nexport function buildDirectTaskPayload(\n message: string,\n via: 'p2p_direct' | 'local_direct' | 'mesh_send_task',\n opts: {\n taskId: string;\n taskMode?: string;\n providerType?: string;\n targetSessionId?: string;\n /** When true, the target session was idle at time of dispatch. This flag helps\n * mesh-active-work stale detection identify unacknowledged direct dispatches. */\n dispatchedToIdleSession?: boolean;\n },\n): Record<string, unknown> {\n const descriptor = summarizeTaskMessage(message);\n return {\n source: 'direct',\n via,\n taskId: opts.taskId,\n message,\n taskTitle: descriptor.taskTitle,\n taskSummary: descriptor.taskSummary,\n ...(opts.taskMode ? { taskMode: opts.taskMode } : {}),\n ...(opts.providerType ? { providerType: opts.providerType } : {}),\n ...(opts.targetSessionId ? { targetSessionId: opts.targetSessionId } : {}),\n ...(opts.dispatchedToIdleSession !== undefined ? { dispatchedToIdleSession: opts.dispatchedToIdleSession } : {}),\n };\n}\n\nexport function findNode(mesh: LocalMeshEntry, nodeId: string): LocalMeshNodeEntry {\n const node = mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (!node) throw new Error(`Node '${nodeId}' is not a member of mesh '${mesh.name}'`);\n return node;\n}\n\nexport const DUPLICATE_DISPATCH_WINDOW_MS = 60_000;\n\n// (queue constants/types moved to ./mesh-queue-helpers.ts)\n\n/**\n * Refresh the MCP process's mesh snapshot from the daemon inline mesh cache.\n * This is required for status/list tools when a previous MCP process already\n * created or removed worktree nodes through clone_mesh_node/remove_mesh_node.\n */\nexport async function refreshMeshFromDaemon(ctx: MeshContext): Promise<void> {\n try {\n const result = await ctx.transport.command('get_mesh', { meshId: ctx.mesh.id }) as any;\n if (!result?.success || !Array.isArray(result.mesh?.nodes)) return;\n const refreshedNodes = result.mesh.nodes\n .filter((n: any) => n?.id)\n .map((n: any) => n as LocalMeshNodeEntry);\n (ctx.mesh.nodes as LocalMeshNodeEntry[]).splice(0, ctx.mesh.nodes.length, ...refreshedNodes);\n ctx.mesh.updatedAt = result.mesh.updatedAt ?? ctx.mesh.updatedAt;\n } catch { /* refresh is best-effort; callers still report their original status/errors */ }\n}\n\nexport async function syncCoordinatorDaemonMeshCache(ctx: MeshContext): Promise<void> {\n if (!(ctx.transport instanceof IpcTransport)) return;\n try {\n await (ctx.transport as IpcTransport).command('get_mesh', {\n meshId: ctx.mesh.id,\n inlineMesh: ctx.mesh,\n });\n } catch {\n /* cache sync is best-effort; the MCP process still keeps its local ctx.mesh copy */\n }\n}\n\nexport async function findNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry> {\n const hit = ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n const refreshed = ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (!refreshed) throw new Error(`Node '${nodeId}' is not a member of mesh '${ctx.mesh.name}'`);\n return refreshed;\n}\n\nexport async function findOptionalNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry | null> {\n const hit = ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n return ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId)) ?? null;\n}\n\nexport function hasRecentDuplicateDispatch(ctx: MeshContext, args: { node_id: string; session_id?: string; message: string }): { duplicate: boolean; entry?: any; source?: 'ledger' | 'queue' } {\n const now = Date.now();\n const normalizedMessage = args.message.trim();\n\n for (const task of getQueue(ctx.mesh.id)) {\n const timestamp = new Date(task.updatedAt || task.createdAt).getTime();\n if (!Number.isFinite(timestamp) || now - timestamp > DUPLICATE_DISPATCH_WINDOW_MS) continue;\n if (task.targetNodeId && task.targetNodeId !== args.node_id) continue;\n if (task.assignedNodeId && task.assignedNodeId !== args.node_id) continue;\n if (args.session_id && task.targetSessionId !== args.session_id && task.assignedSessionId !== args.session_id) continue;\n if (task.message?.trim() === normalizedMessage) {\n return { duplicate: true, entry: task, source: 'queue' };\n }\n }\n\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n const timestamp = new Date(entry.timestamp).getTime();\n if (Number.isFinite(timestamp) && now - timestamp > DUPLICATE_DISPATCH_WINDOW_MS) break;\n if (entry.kind !== 'task_dispatched') continue;\n if (entry.nodeId !== args.node_id) continue;\n if (args.session_id && entry.sessionId !== args.session_id) continue;\n if (typeof entry.payload?.message !== 'string') continue;\n if (entry.payload.message.trim() === normalizedMessage) {\n return { duplicate: true, entry, source: 'ledger' };\n }\n }\n return { duplicate: false };\n}\n\nexport function buildMissingNodeReadChatRecovery(ctx: MeshContext, args: { node_id: string; session_id: string; provider_session_id?: string; tail?: number; compact?: boolean }): Record<string, unknown> {\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 300 });\n const relatedEntries = entries.filter(entry => entry.nodeId === args.node_id || entry.sessionId === args.session_id);\n const completedEntries = relatedEntries.filter(entry => entry.kind === 'task_completed');\n const lastDispatch = [...relatedEntries].reverse().find(entry => entry.kind === 'task_dispatched');\n const lastTerminal = [...relatedEntries].reverse().find(entry => entry.kind === 'task_completed' || entry.kind === 'task_failed' || entry.kind === 'task_stalled');\n const lastRemoved = [...relatedEntries].reverse().find(entry => entry.kind === 'node_removed');\n const lastLaunch = [...relatedEntries].reverse().find(entry => entry.kind === 'session_launched');\n const providerSessionId = args.provider_session_id\n || readString(lastTerminal?.payload?.providerSessionId)\n || readString(lastLaunch?.payload?.providerSessionId)\n || readString(lastDispatch?.payload?.providerSessionId);\n const finalSummary = readString(lastTerminal?.payload?.finalSummary)\n || readString(lastTerminal?.payload?.compactSummary)\n || readString(lastTerminal?.payload?.summary);\n const ledger = {\n taskCompletedFound: completedEntries.length > 0,\n nodeRemovedFound: !!lastRemoved,\n providerType: lastTerminal?.providerType || lastLaunch?.providerType || lastDispatch?.providerType,\n providerSessionId,\n nodeRemovedAt: lastRemoved?.timestamp,\n sessionCleanupMode: readString(lastRemoved?.payload?.sessionCleanupMode),\n readDebugLocator: readString(lastTerminal?.payload?.readDebugLocator) || readString(lastTerminal?.payload?.debugBundlePath),\n };\n\n if (finalSummary) {\n if (args.compact === true) {\n return {\n ...compactChatPayload({\n success: true,\n status: 'idle',\n providerSessionId,\n summary: finalSummary,\n messages: [{ role: 'assistant', content: finalSummary, isHistorical: true }],\n }, {\n nodeId: args.node_id,\n sessionId: args.session_id,\n limit: args.tail ?? 10,\n }),\n recoveredFromLedger: true,\n ledger,\n };\n }\n return {\n success: true,\n compact: false,\n recoveredFromLedger: true,\n nodeId: args.node_id,\n sessionId: args.session_id,\n summary: finalSummary,\n ledger,\n messages: [{ role: 'assistant', content: finalSummary, isHistorical: true }],\n };\n }\n\n return {\n success: false,\n recoverable: true,\n code: 'mesh_removed_node_transcript_unavailable',\n error: `Node '${args.node_id}' is not a current member of mesh '${ctx.mesh.name}'.`,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerSessionId,\n reason: 'node_not_in_current_mesh_snapshot',\n ledger,\n completedSessionSeenInLedger: ledger.taskCompletedFound,\n lastDispatch: lastDispatch ? {\n timestamp: lastDispatch.timestamp,\n sessionId: lastDispatch.sessionId,\n providerType: lastDispatch.providerType,\n taskId: typeof lastDispatch.payload?.taskId === 'string' ? lastDispatch.payload.taskId : undefined,\n messagePreview: typeof lastDispatch.payload?.message === 'string' ? lastDispatch.payload.message.slice(0, 500) : undefined,\n } : null,\n lastTerminalEvent: lastTerminal ? {\n kind: lastTerminal.kind,\n timestamp: lastTerminal.timestamp,\n sessionId: lastTerminal.sessionId,\n providerType: lastTerminal.providerType,\n taskId: typeof lastTerminal.payload?.taskId === 'string' ? lastTerminal.payload.taskId : undefined,\n payload: lastTerminal.payload,\n } : null,\n nextSteps: [\n providerSessionId\n ? `Retry mesh_read_chat with provider_session_id='${providerSessionId}' on a current live node for the same daemon if one exists.`\n : 'If the node UI shows a provider transcript id, retry mesh_read_chat/mesh_read_debug with provider_session_id.',\n 'Use mesh_read_debug with the provider_session_id or daemon-side debug bundle locator if available.',\n 'Check mesh_task_history for task_completed and node_removed entries before redispatching; do not resend solely because transcript recovery failed.',\n 'If this node was removed with stop_and_delete, the runtime transcript may be gone; rely on the ledger summary/locator or ask the operator for the saved UI output.',\n ],\n recoveryHints: [\n 'The worktree/node may have been removed or the mesh snapshot may be stale after task completion.',\n 'If you have a provider_session_id, retry mesh_read_chat with that value while targeting a live node for the same daemon if available.',\n 'Use mesh_read_debug with provider_session_id, or inspect the daemon/session-host history locator if the transcript has already been archived.',\n 'Avoid redispatching the same task solely because read_chat could not recover the transcript; check task_history and git status first.',\n ],\n };\n}\n\n\n// (queue helpers moved to ./mesh-queue-helpers.ts)\n\n// (moved to ./mesh-session-helpers.ts — session/payload record helpers)\n\nexport function isDirectDispatchLedgerEntry(entry: any): boolean {\n if (entry?.kind !== 'task_dispatched') return false;\n const payload = entry.payload || {};\n const via = readString(payload.via);\n return payload.source === 'direct' || via === 'p2p_direct' || via === 'local_direct' || via === 'mesh_send_task';\n}\n\nexport function readMessageTimestampIso(message: any): string | undefined {\n for (const value of [message?.timestamp, message?.createdAt, message?.created_at, message?.updatedAt, message?.time]) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const ms = value > 10_000_000_000 ? value : value * 1000;\n return new Date(ms).toISOString();\n }\n if (typeof value === 'string' && value.trim()) {\n const ms = new Date(value.trim()).getTime();\n if (Number.isFinite(ms)) return new Date(ms).toISOString();\n }\n }\n return undefined;\n}\n\nexport function readFinalAssistantTranscriptEvidence(payload: any): { finalSummary?: string; transcriptMessageAt?: string } {\n const rawMessages = Array.isArray(payload?.messages) ? payload.messages : [];\n const finalAssistant = [...rawMessages]\n .reverse()\n .filter(isCoordinatorVisibleMessage)\n .find((message: any) => {\n const role = String(message?.role ?? '').toLowerCase();\n return (role === 'assistant' || role === 'agent') && messageContent(message).trim();\n });\n const finalSummary = messageContent(finalAssistant).trim()\n || (typeof payload?.summary === 'string' && payload.summary.trim() ? payload.summary.trim() : undefined);\n return {\n finalSummary,\n transcriptMessageAt: finalAssistant ? readMessageTimestampIso(finalAssistant) : undefined,\n };\n}\n\nexport function findNodeSession(nodes: any[], nodeId?: string | null, sessionId?: string | null): { node?: any; session?: any } {\n if (!nodeId || !sessionId) return {};\n const node = nodes.find((candidate: any) => meshNodeIdMatches(candidate, nodeId));\n if (!node) return {};\n const sessions = Array.isArray(node.sessions) ? node.sessions : [];\n const session = sessions.find((candidate: any) => readSessionRecordId(candidate) === sessionId);\n return { node, session };\n}\n\nexport function buildDirectDispatchReconciliationCandidates(directDispatches: any[], ledgerEntries: any[]): any[] {\n const candidates: any[] = [];\n const seenTaskIds = new Set<string>();\n for (const dispatch of directDispatches || []) {\n const taskId = readString(dispatch?.taskId);\n if (!taskId || seenTaskIds.has(taskId)) continue;\n seenTaskIds.add(taskId);\n candidates.push(dispatch);\n }\n for (const entry of ledgerEntries || []) {\n if (!isDirectDispatchLedgerEntry(entry)) continue;\n const taskId = readString(entry.payload?.taskId);\n if (!taskId || seenTaskIds.has(taskId)) continue;\n seenTaskIds.add(taskId);\n candidates.push({\n taskId,\n nodeId: entry.nodeId,\n sessionId: entry.sessionId,\n providerType: entry.providerType || readString(entry.payload?.providerType),\n message: readString(entry.payload?.message),\n dispatchedAt: entry.timestamp,\n via: readString(entry.payload?.via),\n });\n }\n return candidates;\n}\n\nexport async function reconcileDirectDispatchesFromTranscriptEvidence(\n ctx: MeshContext,\n liveNodes: any[],\n directDispatches: any[],\n ledgerEntries: any[],\n): Promise<{ attempted: number; reconciled: number; skipped: number }> {\n let attempted = 0;\n let reconciled = 0;\n let skipped = 0;\n const candidates = buildDirectDispatchReconciliationCandidates(directDispatches, ledgerEntries);\n for (const dispatch of candidates) {\n const taskId = readString(dispatch?.taskId);\n const nodeId = readString(dispatch?.nodeId);\n const sessionId = readString(dispatch?.sessionId);\n if (!taskId || !nodeId || !sessionId) {\n skipped += 1;\n continue;\n }\n const { session } = findNodeSession(liveNodes, nodeId, sessionId);\n if (!session || !isIdleSessionRecord(session)) {\n skipped += 1;\n continue;\n }\n const node = await findOptionalNodeWithRefresh(ctx, nodeId).catch(() => null);\n if (!node) {\n skipped += 1;\n continue;\n }\n const providerType = readString(dispatch?.providerType) || resolveSessionProviderType(session);\n const providerSessionId = readString(session?.providerSessionId)\n || readString(session?.activeChat?.providerSessionId)\n || readString(session?.settings?.providerSessionId)\n || resolveMeshSessionProviderMetadata(ctx, nodeId, sessionId)?.providerSessionId;\n attempted += 1;\n try {\n const readResult = await commandForNode(ctx, node, 'read_chat', {\n sessionId,\n targetSessionId: sessionId,\n workspace: node.workspace,\n ...(providerType ? { agentType: providerType, providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n tailLimit: 10,\n });\n const payload = unwrapCommandPayload(readResult);\n if (payload?.success === false) continue;\n const evidence = readFinalAssistantTranscriptEvidence(payload);\n if (!evidence.finalSummary) continue;\n const result = reconcileDirectDispatchCompletionFromTranscript({\n meshId: ctx.mesh.id,\n nodeId,\n sessionId,\n providerType,\n providerSessionId: readString(payload?.providerSessionId) || providerSessionId,\n taskId,\n finalSummary: evidence.finalSummary,\n transcriptMessageAt: evidence.transcriptMessageAt,\n targetCoordinatorDaemonId: ctx.localDaemonId,\n source: 'mcp_mesh_status_transcript_reconciliation',\n });\n if (result.reconciled) reconciled += 1;\n } catch {\n skipped += 1;\n }\n }\n return { attempted, reconciled, skipped };\n}\n\nexport async function triggerMeshQueueAndReport(\n ctx: MeshContext,\n): Promise<Record<string, unknown> | undefined> {\n try {\n // trigger_mesh_queue is a coordinator-only operation: triggerMeshQueue\n // reads the mesh object, the coordinator's local CLI instances, and the\n // queue ledger (stored on THIS machine), then dispatches assignments to\n // remote idle sessions over P2P itself. Relaying trigger_mesh_queue to a\n // remote worker daemon would hit requireMeshHostMutationOwner →\n // getMeshForCommand → null ('Mesh not found'), because only the\n // coordinator daemon hosts the mesh. Always run it on the coordinator's\n // local IPC, regardless of which node prompted the trigger.\n const raw = await ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id });\n const payload = unwrapCommandPayload(raw);\n const trigger = payload?.trigger && typeof payload.trigger === 'object' ? payload.trigger : payload;\n return trigger && typeof trigger === 'object' ? trigger : { success: true };\n } catch (e: any) {\n return {\n success: false,\n error: e?.message || String(e),\n };\n }\n}\n\nexport function buildQueueTriggerGuidance(queueTrigger: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!queueTrigger || queueTrigger.claimed === true) return undefined;\n if (queueTrigger.success === false) {\n return {\n queueClaimed: false,\n queueDispatchState: 'trigger_failed',\n nextAction: 'Do not assume the queued task is running. Check mesh_view_queue and daemon connectivity before redispatching.',\n };\n }\n if (queueTrigger.autoLaunchPending === true) {\n // The coordinator already spun up (or is spinning up) a worker session for this\n // task — it is booting and will claim within a few seconds. Telling the caller to\n // launch ANOTHER session here would double-edit the worktree. Do NOT advise a new\n // launch; just wait for the in-flight session to claim.\n return {\n queueClaimed: false,\n queueDispatchState: 'pending_waiting_for_autolaunch',\n nextAction: 'A worker session was just auto-launched for this task and is booting; it will claim the task shortly. Wait for it to claim — do NOT launch another session. Use mesh_view_queue to confirm the assignment lands.',\n };\n }\n if (queueTrigger.noIdleMeshSessionAvailable === true) {\n return {\n queueClaimed: false,\n queueDispatchState: 'pending_no_idle_mesh_session',\n nextAction: 'The task is queued but not running. Launch a managed worker with mesh_launch_session, or wait for a delegated session to become ready and trigger the queue again.',\n };\n }\n return {\n queueClaimed: false,\n queueDispatchState: 'pending_or_waiting_for_ready',\n nextAction: 'The task is queued but this trigger did not claim it. Use mesh_view_queue for the current active-work source of truth before retrying.',\n };\n}\n\n\n// (moved to ./mesh-session-helpers.ts — session/payload record helpers)\n\nexport function isMeshOwnedDelegateSession(session: any, meshId: string, nodeId: string): boolean {\n const settings = session?.settings;\n const sessionMeshId = typeof settings?.meshNodeFor === 'string' ? settings.meshNodeFor.trim() : '';\n const sessionNodeId = typeof settings?.meshNodeId === 'string' ? settings.meshNodeId.trim() : '';\n // meshNodeFor is the primary ownership signal. Relay safety is checked separately\n // for remote dispatch because older local delegates may not carry coordinator\n // daemon metadata.\n if (sessionMeshId) {\n if (sessionMeshId !== meshId) return false;\n return !sessionNodeId || sessionNodeId === nodeId;\n }\n // Post-detach: detachMeshAssignment intentionally clears meshNodeFor / meshNodeId /\n // meshActiveTaskId after a relay-safe completion, but preserves the coordinator\n // markers (launchedByCoordinator / meshCoordinatorDaemonId). Without recognizing\n // those, a follow-up dispatch to the SAME session would be misclassified as an\n // unrelated alias and rejected — even though the router self-heals meshNodeFor /\n // meshNodeId at dispatch time (buildMeshWorkerRelayStamp). Treat the preserved\n // coordinator markers as ownership evidence so the dispatch-time restamp can run.\n const coordinatorOwned = settings?.launchedByCoordinator === true || Boolean(readString(settings?.meshCoordinatorDaemonId));\n if (!coordinatorOwned) return false;\n // WTCLAIM (A): a detached coordinator session is reusable, but ONLY for the node\n // it last served. detachMeshAssignment preserves meshLastNodeId (the sticky bind\n // marker). On a daemon hosting BOTH a base node and a cloned worktree node (same\n // daemonId), without this gate a detached BASE session would be auto-picked for a\n // worktree-targeted sessionless dispatch — running worktree work on the base node.\n // When the sticky marker is present it must equal the requested node; legitimate\n // same-node reuse still passes. When absent (never bound, or a pre-fix session),\n // fall back to the prior permissive behavior — fix (B)'s worker-side nodeId/\n // workspace scoping is the defense-in-depth backstop for that residual case.\n const lastNodeId = readString(settings?.meshLastNodeId);\n if (lastNodeId) return lastNodeId === nodeId;\n return true;\n}\n\nexport function hasRemoteRelayMetadata(session: any): boolean {\n return Boolean(\n readString(session?.settings?.meshCoordinatorDaemonId)\n || readString(session?.meta?.meshCoordinatorDaemonId)\n || readString(session?.metadata?.meshCoordinatorDaemonId)\n || readString(session?.meshCoordinatorDaemonId),\n );\n}\n\nexport function isRelaySafeRemoteDelegateSession(session: any, meshId: string, nodeId: string): boolean {\n return isMeshOwnedDelegateSession(session, meshId, nodeId) && hasRemoteRelayMetadata(session);\n}\n\n\n/**\n * Pre-dispatch relay-safety classification for an explicit remote delegate\n * session. The local direct-dispatch path (commandForNode → agent_command) has\n * no such gate: it always dispatches with meshContext.coordinatorDaemonId, and\n * the remote router self-heals the session's meshCoordinatorDaemonId at dispatch\n * time (router.ts buildMeshWorkerRelayStamp). The remote path used to hard-block\n * any session lacking meshCoordinatorDaemonId, which prevented that dispatch-time\n * stamp from ever running — leaving launch-stamp-less but otherwise mesh-owned\n * sessions permanently relay-unsafe.\n *\n * Mirror the local path: a session that is mesh-owned for THIS mesh self-heals\n * as long as we can hand the remote router a coordinator anchor to stamp.\n *\n * - 'safe' — already carries meshCoordinatorDaemonId; dispatch as-is.\n * - 'self_heal' — mesh-owned for this mesh, missing the anchor, but a\n * coordinatorDaemonId is resolvable → dispatch and let the\n * remote router stamp the anchor (parity with local path).\n * - 'missing_anchor' — mesh-owned for this mesh, missing the anchor, AND no\n * coordinatorDaemonId resolvable → cannot delegate the stamp,\n * so completion events would still be undeliverable → block.\n * - 'unsafe_alias' — not mesh-owned for this mesh (different mesh / unrelated\n * session). Dispatching risks aliasing an unrelated transcript\n * and orphaning completion events → block.\n */\nexport function classifyRemoteDelegateRelaySafety(\n session: any,\n meshId: string,\n nodeId: string,\n coordinatorDaemonId: string,\n): 'safe' | 'self_heal' | 'missing_anchor' | 'unsafe_alias' {\n if (!isMeshOwnedDelegateSession(session, meshId, nodeId)) return 'unsafe_alias';\n if (hasRemoteRelayMetadata(session)) return 'safe';\n return coordinatorDaemonId ? 'self_heal' : 'missing_anchor';\n}\n\nexport function chooseDispatchableSession(sessions: any[], providerType: string, meshId: string, nodeId: string, coordinatorDaemonId: string): any | undefined {\n const live = sessions.filter(session => !isTerminalSessionRecord(session));\n const matchingProvider = (session: any) => !providerType || session?.providerType === providerType || session?.cliType === providerType;\n // Accept mesh-owned sessions whose relay anchor is either already present or\n // self-healable at dispatch time (coordinatorDaemonId resolvable). Mirrors the\n // explicit-session relay-safety classification so auto-pick and explicit\n // dispatch converge on the same set of safe delegates.\n const meshSessions = live.filter((session: any) => {\n const safety = classifyRemoteDelegateRelaySafety(session, meshId, nodeId, coordinatorDaemonId);\n return safety === 'safe' || safety === 'self_heal';\n });\n // Only auto-pick an IDLE matching session. The previous\n // `|| meshSessions.find(matchingProvider)` fallback accepted a generating/busy\n // session, injecting a new task into a session mid-generation — the exact case\n // the explicit-session path guards against via resolveDeliveryDecision (queue or\n // reject when !idle). When no idle session exists, return undefined so the caller\n // dispatches sessionless and lets the worker pick/create a session (or the task\n // queues), instead of clobbering an in-flight one.\n return meshSessions.find(session => isIdleSessionRecord(session) && matchingProvider(session))\n || undefined;\n}\n\nexport function buildRelayUnsafeRemoteSessionFailure(ctx: MeshContext, node: LocalMeshNodeEntry, sessionId: string, providerType?: string): ({ success: false; error: string } & Record<string, unknown>) {\n return {\n success: false,\n recoverable: true,\n code: 'mesh_delegate_session_missing_relay_metadata',\n reason: 'mesh_delegate_session_missing_relay_metadata',\n transport: 'mesh_transport',\n retryRecommended: true,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId: node.daemonId,\n workspace: node.workspace,\n sessionId,\n unsafeTranscriptAlias: true,\n ...(providerType ? { resolvedProviderType: providerType } : {}),\n error: `Remote session '${sessionId}' is not relay-safe for mesh '${ctx.mesh.id}': missing meshNodeFor/meshCoordinatorDaemonId metadata, so completion events would not reach the coordinator ledger. This session may be the coordinator itself or an unrelated session (unsafe_transcript_alias risk).`,\n nextAction: `Launch a fresh relay-safe session with mesh_launch_session(node_id: '${node.id}'${providerType ? `, type: '${providerType}'` : ''}) or dispatch without session_id so Repo Mesh can choose a valid delegate session.`,\n noFallbackReason: 'Blindly reusing a remote session without mesh relay metadata would silently drop task_completed / generating_completed events.',\n };\n}\n\nexport function buildMissingCoordinatorDaemonIdFailure(ctx: MeshContext, node: LocalMeshNodeEntry, providerType?: string): ({ success: false; error: string } & Record<string, unknown>) {\n return {\n success: false,\n recoverable: true,\n code: 'mesh_coordinator_daemon_unknown',\n reason: 'mesh_coordinator_daemon_unknown',\n transport: 'mesh_transport',\n retryRecommended: true,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId: node.daemonId,\n workspace: node.workspace,\n ...(providerType ? { resolvedProviderType: providerType } : {}),\n error: `Cannot launch a remote mesh delegate for node '${node.id}': coordinator daemon identity is unavailable, so the worker would be unable to relay completion events back to the coordinator.`,\n nextAction: 'Retry after the coordinator daemon identity is available (for example from an attached daemon-backed MCP session) so meshCoordinatorDaemonId can be stamped on the worker session.',\n noFallbackReason: 'Launching without meshCoordinatorDaemonId would create a worker session that can finish work but cannot emit task_completed / generating_completed back to the coordinator.',\n };\n}\n\nexport function findNestedPayload(value: any, predicate: (payload: any) => boolean): any {\n const seen = new Set<any>();\n const stack: Array<{ payload: any; depth: number }> = [{ payload: value, depth: 0 }];\n\n while (stack.length) {\n const { payload, depth } = stack.pop()!;\n if (predicate(payload)) return payload;\n if (!payload || typeof payload !== 'object' || seen.has(payload) || depth >= 8) continue;\n seen.add(payload);\n\n // Cloud/daemon relay layers have used both `result` and `payload` for\n // command_result bodies. Follow only those envelope keys so clone node\n // discovery stays tied to returned command payloads, not arbitrary data.\n for (const key of ['payload', 'result']) {\n if (key in payload) stack.push({ payload: payload[key], depth: depth + 1 });\n }\n }\n\n return value;\n}\n\nexport function extractCloneNodePayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.node?.id));\n}\n\nexport function extractGitStatus(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.status ?? value?.status ?? payload;\n}\n\nexport function extractGitDiff(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.diffSummary ?? payload?.diff ?? value?.diffSummary ?? value?.diff ?? payload;\n}\n\nexport function extractSubmodules(value: any, ignorePaths: string[]): any[] | undefined {\n const payload = unwrapCommandPayload(value);\n const subs = payload?.status?.submodules\n ?? payload?.submodules\n ?? value?.status?.submodules\n ?? value?.submodules;\n if (!Array.isArray(subs)) return undefined;\n if (ignorePaths.length === 0) return subs;\n const ignoreSet = new Set(ignorePaths);\n return subs.filter((s: any) => s?.path && !ignoreSet.has(s.path));\n}\n\nexport function assignFullGitSnapshot(entry: Record<string, unknown>, status: any): void {\n if (!status || typeof status !== 'object' || Array.isArray(status)) return;\n entry.git = status;\n}\n\n\n// (compact git-snapshot helpers moved to ./mesh-compact.ts)\n\n// (compactMeshStatusNode moved to ./mesh-compact.ts)\n\n// Compact mode bounds the node array so the payload stays under the MCP token cap\n// regardless of how many worktree nodes a mesh has. EVERY node stays present and\n// individually addressable (coordinators look nodes up by id), but \"quiet\" nodes —\n// healthy/clean, no sessions, nothing to converge — are reduced to a minimal stub\n// (id/workspace/health/branch/launchReady + branchConvergence decision scalars)\n// while \"noteworthy\" nodes (anything actionable) keep the full compact detail. On\n// top of that the detailed set is held to a serialized byte budget (highest\n// severity first); when the budget is exceeded the lowest-priority detailed nodes\n// degrade to the same minimal stub so even a mesh of all-noteworthy nodes can't\n// blow the cap. No node is ever dropped — only its detail level is reduced.\nexport const COMPACT_DETAILED_NODES_BYTE_BUDGET = 9000;\n\n// Total byte budget for the whole compact node array (detail + minimal stubs).\n// Nodes that don't fit even as a stub are folded into a counts+id-list summary so\n// the array stays bounded on pathologically large meshes; every node id is still\n// listed in foldedNodes.nodeIds, so nothing becomes undiscoverable.\nexport const COMPACT_NODES_TOTAL_BYTE_BUDGET = 13000;\n\n\n// Byte budget for the whole compact `missions` array (live active/paused missions).\n// Completed/abandoned history is already folded to a counts+id summary upstream;\n// this bounds the LIVE-mission detail so the section can't grow unbounded with the\n// number of active/paused missions. Newest-active first; overflow is folded into\n// `foldedMissions` (id list) so every live mission id stays addressable.\nexport const COMPACT_MISSIONS_BYTE_BUDGET = 6000;\n\n\n// (compact node-fold helpers moved to ./mesh-compact.ts)\n\nexport function extractLaunchPayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.sessionId || payload?.id || payload?.runtimeSessionId));\n}\n\nexport type MeshLaunchFailureClassification = {\n code: string;\n reason: string;\n transport: string;\n recoverable: boolean;\n retryRecommended: boolean;\n nextAction: string;\n noFallbackReason?: string;\n};\n\nexport function classifyMeshLaunchFailure(error: unknown): MeshLaunchFailureClassification {\n const message = error instanceof Error ? error.message : String(error || 'launch failed');\n const lower = message.toLowerCase();\n const p2pClassification = classifyP2pRelayFailure(error, { command: 'launch_cli' });\n if (p2pClassification.recoverable) {\n return p2pClassification;\n }\n if (lower.includes('cannot connect to daemon ipc') || lower.includes('daemon ipc command')) {\n return {\n code: 'local_ipc_unavailable',\n reason: 'local_daemon_ipc_unavailable',\n transport: 'local_ipc',\n recoverable: true,\n retryRecommended: true,\n nextAction: 'Check the local daemon IPC connection, then retry mesh_launch_session once after the daemon is reachable.',\n };\n }\n if (lower.includes('timed out') || lower.includes('timeout')) {\n return {\n code: 'mesh_transport_timeout',\n reason: 'mesh_transport_timeout',\n transport: 'mesh_transport',\n recoverable: true,\n retryRecommended: true,\n nextAction: 'Check mesh transport health, then do one bounded retry before requeueing or relaunching the task.',\n };\n }\n return {\n code: 'mesh_launch_failed',\n reason: 'provider_launch_failed',\n transport: 'mesh_transport',\n recoverable: false,\n retryRecommended: false,\n nextAction: 'Inspect the provider launch error and fix the underlying provider/configuration issue before retrying.',\n };\n}\n\nexport function buildWorktreeCleanupHint(node: LocalMeshNodeEntry): Record<string, unknown> | undefined {\n if (!node.isLocalWorktree) return undefined;\n return {\n tool: 'mesh_remove_node',\n args: { node_id: node.id, session_cleanup_mode: 'preserve' },\n hint: `If the worktree is no longer needed, remove the orphan worktree node with mesh_remove_node(node_id: \"${node.id}\").`,\n };\n}\n\nexport function buildRecoverableLaunchFailure(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n providerType: string | undefined,\n error: unknown,\n): Record<string, unknown> {\n const message = error instanceof Error ? error.message : String(error || 'launch failed');\n const classified = classifyMeshLaunchFailure(error);\n const cleanup = buildWorktreeCleanupHint(node);\n return {\n success: false,\n recoverable: classified.recoverable,\n code: classified.code,\n reason: classified.reason,\n transport: classified.transport,\n retryRecommended: classified.retryRecommended,\n nextAction: classified.nextAction,\n ...(classified.noFallbackReason ? { noFallbackReason: classified.noFallbackReason } : {}),\n error: message,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId: node.daemonId,\n workspace: node.workspace,\n isLocalWorktree: node.isLocalWorktree === true,\n worktreeBranch: node.worktreeBranch,\n clonedFromNodeId: node.clonedFromNodeId,\n ...(providerType ? { resolvedProviderType: providerType } : {}),\n retryHint: `Retry mesh_launch_session(node_id: \"${node.id}\"${providerType ? `, type: \"${providerType}\"` : ''}) after daemon mesh transport/P2P is healthy.`,\n ...(cleanup ? { cleanup } : {}),\n nextStepHints: [\n `Retry mesh_launch_session(node_id: \"${node.id}\"${providerType ? `, type: \"${providerType}\"` : ''}) after checking daemon/P2P health.`,\n ...(cleanup ? [`Cleanup orphan worktree node with mesh_remove_node(node_id: \"${node.id}\") if retry is not desired.`] : []),\n 'Run mesh_status to see the degraded reason and recovery hints before redispatching work.',\n ],\n };\n}\n\nexport function recordRecoverableLaunchFailure(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n providerType: string | undefined,\n error: unknown,\n): Record<string, unknown> {\n const failure = buildRecoverableLaunchFailure(ctx, node, providerType, error);\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'recovery_attempted',\n nodeId: node.id,\n providerType,\n payload: {\n event: 'session_launch_failed',\n ...failure,\n },\n });\n } catch { /* ledger append is best-effort */ }\n return failure;\n}\n\nexport function getLatestActiveLaunchFailure(meshId: string, nodeId: string): Record<string, unknown> | null {\n const entries = readLedgerEntries(meshId, { tail: 200 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n if (entry.nodeId !== nodeId) continue;\n if (entry.kind === 'session_launched' || entry.kind === 'node_removed') return null;\n if (entry.kind === 'recovery_attempted' && entry.payload?.event === 'session_launch_failed') {\n return { timestamp: entry.timestamp, ...entry.payload };\n }\n }\n return null;\n}\n\nexport type RemoteAgentDispatchResult =\n | { success: true; dispatched: true; sessionId: string; providerType?: string }\n | ({ success: false; error: string } & Record<string, unknown>);\n\nexport function buildCoordinatorP2pRelayFailure(\n error: unknown,\n context: { command: string; targetDaemonId?: string; nodeId?: string; sessionId?: string },\n): { success: false; error: string } & Record<string, unknown> {\n const payload = buildP2pRelayFailurePayload(error, {\n command: context.command,\n targetDaemonId: context.targetDaemonId,\n });\n return {\n ...payload,\n ...(context.nodeId ? { nodeId: context.nodeId } : {}),\n ...(context.sessionId ? { sessionId: context.sessionId } : {}),\n retryHint: payload.retryRecommended ? payload.nextAction : 'Do not retry as a P2P transport recovery; inspect the command/provider error first.',\n };\n}\n\n\n/**\n * For IpcTransport + remote node: resolve an active session on the node and\n * dispatch an agent_command directly via P2P relay (mesh_relay_command).\n *\n * This bypasses the local queue (which remote daemons cannot read) and sends\n * the message directly to the session running on the remote daemon.\n *\n * Returns { success, sessionId } or throws.\n */\nexport async function ipcDispatchToRemoteAgent(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n args: { session_id?: string; message: string; providerType?: string; verifiedSession?: any; meshContext?: { meshId: string; nodeId?: string; taskId?: string; coordinatorDaemonId?: string } },\n): Promise<RemoteAgentDispatchResult> {\n const transport = ctx.transport as IpcTransport;\n const daemonId = node.daemonId!;\n\n // The coordinator anchor the remote router will stamp onto the worker session\n // at dispatch time (router.ts buildMeshWorkerRelayStamp). When present, a\n // mesh-owned session that was never launch-stamped can still self-heal to\n // relay-safe — exactly like the local direct-dispatch path.\n const dispatchCoordinatorDaemonId = readString(args.meshContext?.coordinatorDaemonId) || '';\n\n let sessionId = args.session_id?.trim() || '';\n // Resolve provider type: caller arg > node policy providerPriority > empty (fuzzy fallback)\n const providerPriorityList: string[] = Array.isArray((node.policy as any)?.providerPriority)\n ? (node.policy as any).providerPriority\n : [];\n let resolvedProviderType = args.providerType?.trim() || providerPriorityList[0] || '';\n\n // Ask the remote daemon for live session truth when we need to auto-pick a\n // delegate session, or when an explicit session_id must be verified as a\n // relay-safe mesh-owned worker before we dispatch into it.\n if (sessionId && args.verifiedSession) {\n const explicitSession = args.verifiedSession;\n const relaySafety = classifyRemoteDelegateRelaySafety(explicitSession, ctx.mesh.id, node.id, dispatchCoordinatorDaemonId);\n if (relaySafety === 'unsafe_alias') {\n return buildRelayUnsafeRemoteSessionFailure(\n ctx,\n node,\n sessionId,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n if (relaySafety === 'missing_anchor') {\n return buildMissingCoordinatorDaemonIdFailure(\n ctx,\n node,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n // 'safe' or 'self_heal' → dispatch; the remote router stamps the relay\n // anchor from meshContext.coordinatorDaemonId when self-healing.\n if (!resolvedProviderType) {\n resolvedProviderType = resolveSessionProviderType(explicitSession);\n }\n } else if (!sessionId || args.session_id) {\n try {\n const relayResult = await transport.meshCommand(daemonId, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(relayResult);\n\n if (sessionId) {\n const explicitSession = sessions.find(session => readSessionRecordId(session) === sessionId);\n if (!explicitSession) {\n return {\n success: false,\n recoverable: true,\n code: 'mesh_target_session_not_found',\n reason: 'mesh_target_session_not_found',\n transport: 'mesh_transport',\n retryRecommended: true,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId,\n workspace: node.workspace,\n sessionId,\n ...(resolvedProviderType ? { resolvedProviderType } : {}),\n error: `Remote session '${sessionId}' is not present in the live status for node '${node.id}'.`,\n nextAction: `Launch a fresh session with mesh_launch_session(node_id: '${node.id}'${resolvedProviderType ? `, type: '${resolvedProviderType}'` : ''}) or retry without session_id so Repo Mesh can target a live delegate session.`,\n };\n }\n const relaySafety = classifyRemoteDelegateRelaySafety(explicitSession, ctx.mesh.id, node.id, dispatchCoordinatorDaemonId);\n if (relaySafety === 'unsafe_alias') {\n return buildRelayUnsafeRemoteSessionFailure(\n ctx,\n node,\n sessionId,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n if (relaySafety === 'missing_anchor') {\n return buildMissingCoordinatorDaemonIdFailure(\n ctx,\n node,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n // 'safe' or 'self_heal' → dispatch; the remote router stamps the\n // relay anchor from meshContext.coordinatorDaemonId when self-healing.\n if (!resolvedProviderType) {\n resolvedProviderType = resolveSessionProviderType(explicitSession);\n }\n } else {\n // Prefer live idle sessions launched for this mesh node. Never route\n // a new task into restored/stopped session records; that produces the\n // coordinator-visible \"pending only, chat never received it\" failure.\n const targetSession = chooseDispatchableSession(sessions, resolvedProviderType, ctx.mesh.id, node.id, dispatchCoordinatorDaemonId);\n\n if (targetSession?.id || targetSession?.sessionId) {\n sessionId = targetSession.id || targetSession.sessionId;\n if (!resolvedProviderType) {\n resolvedProviderType = resolveSessionProviderType(targetSession);\n }\n }\n }\n } catch (e: any) {\n if (sessionId) {\n return {\n ...buildCoordinatorP2pRelayFailure(e, {\n command: 'get_status_metadata',\n targetDaemonId: daemonId,\n nodeId: node.id,\n sessionId,\n }),\n success: false,\n error: `Cannot verify remote session '${sessionId}' before dispatch: ${e?.message || String(e)}`,\n };\n }\n // fall through — will attempt dispatch with just providerType (fuzzy)\n }\n }\n\n // agent_command requires agentType — fail if we cannot determine provider type\n if (!resolvedProviderType) {\n return { success: false, error: `Cannot dispatch to remote node '${node.id}': providerType unknown. Set providerPriority on the node policy or call mesh_launch_session first.` };\n }\n\n try {\n const dispatchResult = await transport.meshCommand(daemonId, 'agent_command', {\n ...(sessionId ? { targetSessionId: sessionId } : {}),\n agentType: resolvedProviderType,\n cliType: resolvedProviderType,\n action: 'send_chat',\n message: args.message,\n // WTCLAIM (B): carry the node workspace so a sessionless dispatch can be\n // scoped to THIS node's session on the worker (findAdapter dir match /\n // findMeshNodeAdapter). Without it, a worker hosting both a base node and a\n // cloned worktree node (same daemonId) would fall through to a provider-only\n // fuzzy match and could land worktree work on the base session.\n ...(node.workspace ? { dir: node.workspace } : {}),\n ...(args.meshContext ? { meshContext: args.meshContext } : {}),\n });\n const dispatchPayload = unwrapCommandPayload(dispatchResult);\n if (dispatchPayload?.success === false || dispatchResult?.success === false) {\n const source = dispatchPayload?.success === false ? dispatchPayload : dispatchResult;\n const errorMessage = dispatchPayload?.error || dispatchResult?.error || 'agent_command rejected the task';\n return {\n ...buildCoordinatorP2pRelayFailure(source?.error || errorMessage, {\n command: 'agent_command',\n targetDaemonId: daemonId,\n nodeId: node.id,\n sessionId,\n }),\n ...(source && typeof source === 'object' ? source : {}),\n success: false,\n error: `P2P dispatch failed: ${errorMessage}`,\n };\n }\n // Do NOT fall back to resolvedProviderType for sessionId: a sessionless\n // dispatch (no targetSessionId above) lets the worker pick/create the real\n // session, so the provider type ('claude-cli', …) is NOT a session id.\n // Returning it here used to poison assigned_session_id downstream, breaking\n // findAssignedBySession (provider type vs real session id) and orphaning the\n // task_completed match. Leave it empty so completion matching falls back to\n // taskId via the meshContext.taskId carried in the dispatch.\n return { success: true, dispatched: true, sessionId: sessionId || '', providerType: resolvedProviderType };\n } catch (e: any) {\n const errorMessage = e?.message || String(e);\n return {\n ...buildCoordinatorP2pRelayFailure(e, {\n command: 'agent_command',\n targetDaemonId: daemonId,\n nodeId: node.id,\n sessionId,\n }),\n error: `P2P dispatch failed: ${errorMessage}`,\n };\n }\n}\n\nexport function meshSessionCacheKey(nodeId: string, runtimeSessionId: string): string {\n return `${nodeId}:${runtimeSessionId}`;\n}\n\nexport function rememberMeshSessionProviderMetadata(\n nodeId: string | undefined,\n runtimeSessionId: string | undefined,\n metadata: MeshSessionProviderMetadata,\n): void {\n const keyNodeId = readString(nodeId);\n const keySessionId = readString(runtimeSessionId);\n if (!keyNodeId || !keySessionId) return;\n const providerType = readString(metadata.providerType);\n const providerSessionId = readString(metadata.providerSessionId);\n if (!providerType && !providerSessionId) return;\n const existing = getSessionMetadata(meshSessionCacheKey(keyNodeId, keySessionId)) || { providerType: '' };\n meshSessionProviderMetadata.set(meshSessionCacheKey(keyNodeId, keySessionId), {\n providerType: providerType || existing.providerType,\n providerSessionId: providerSessionId || existing.providerSessionId,\n expiresAt: Date.now() + SESSION_PROVIDER_METADATA_TTL_MS,\n });\n}\n\nexport function rememberMeshSessionProviderMetadataFromEvent(event: any): void {\n const metadataEvent = event?.metadataEvent && typeof event.metadataEvent === 'object'\n ? event.metadataEvent as Record<string, unknown>\n : event && typeof event === 'object'\n ? event as Record<string, unknown>\n : {};\n const nodeId = readString(event?.nodeId) || readString(metadataEvent.nodeId) || readString(metadataEvent.meshNodeId);\n const sessionId = readString(metadataEvent.targetSessionId)\n || readString(metadataEvent.sessionId)\n || readString(metadataEvent.instanceId)\n || readString(event?.sessionId);\n rememberMeshSessionProviderMetadata(nodeId, sessionId, {\n providerType: readString(metadataEvent.providerType) || readString(event?.providerType) || '',\n providerSessionId: readString(metadataEvent.providerSessionId) || readString(event?.providerSessionId),\n });\n}\n\nexport function resolveMeshSessionProviderMetadataFromLedger(\n ctx: MeshContext,\n nodeId: string,\n runtimeSessionId: string,\n): MeshSessionProviderMetadata | undefined {\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 50 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n const payload = entry.payload && typeof entry.payload === 'object' && !Array.isArray(entry.payload)\n ? entry.payload as Record<string, unknown>\n : {};\n const entryNodeId = readString(entry.nodeId) || readString(payload.nodeId) || readString(payload.meshNodeId);\n if (entryNodeId && entryNodeId !== nodeId) continue;\n const entrySessionId = readString(entry.sessionId)\n || readString(payload.targetSessionId)\n || readString(payload.sessionId)\n || readString(payload.instanceId);\n if (entrySessionId !== runtimeSessionId) continue;\n const providerType = readString(entry.providerType) || readString(payload.providerType);\n const completionDiagnostic = payload.completionDiagnostic && typeof payload.completionDiagnostic === 'object' && !Array.isArray(payload.completionDiagnostic)\n ? payload.completionDiagnostic as Record<string, unknown>\n : {};\n const metadataEvent = payload.metadataEvent && typeof payload.metadataEvent === 'object' && !Array.isArray(payload.metadataEvent)\n ? payload.metadataEvent as Record<string, unknown>\n : {};\n const providerSessionId = readString(payload.providerSessionId)\n || readString(completionDiagnostic.providerSessionId)\n || readString(metadataEvent.providerSessionId);\n if (providerType || providerSessionId) {\n return { providerType: providerType || '', providerSessionId };\n }\n }\n return undefined;\n}\n\nexport function resolveMeshSessionProviderMetadata(\n ctx: MeshContext,\n nodeId: string,\n runtimeSessionId: string,\n): MeshSessionProviderMetadata | undefined {\n const cached = getSessionMetadata(meshSessionCacheKey(nodeId, runtimeSessionId));\n if (cached?.providerType || cached?.providerSessionId) return cached;\n const fromLedger = resolveMeshSessionProviderMetadataFromLedger(ctx, nodeId, runtimeSessionId);\n if (fromLedger) rememberMeshSessionProviderMetadata(nodeId, runtimeSessionId, fromLedger);\n return fromLedger;\n}\n\nexport function countUncommittedChanges(status: any): number {\n if (typeof status?.uncommittedChanges === 'number') return status.uncommittedChanges;\n const keys = ['staged', 'modified', 'untracked', 'deleted', 'renamed'];\n const counted = keys.reduce((sum, key) => sum + (Number.isFinite(Number(status?.[key])) ? Number(status[key]) : 0), 0);\n const conflicts = Array.isArray(status?.conflictFiles) ? status.conflictFiles.length : (status?.hasConflicts ? 1 : 0);\n return counted + conflicts;\n}\n\nexport function isGitStatusDirty(status: any): boolean {\n if (typeof status?.isDirty === 'boolean') return status.isDirty;\n if (typeof status?.dirty === 'boolean') return status.dirty;\n if (Array.isArray(status?.submodules) && status.submodules.some((submodule: any) => submodule?.dirty || submodule?.outOfSync || submodule?.error)) return true;\n return countUncommittedChanges(status) > 0;\n}\n\n\n// Large structured fields that bloat refine/batch ledger entries (each can carry a\n// full per-node validation plan + suggested config). In compact mode these are\n// summarized rather than dropped — full detail stays available via verbose=true /\n// mesh_reconcile_ledger.\n// (large-value compaction utils moved to ./mesh-tool-shared.ts)\n\nexport function slimLedgerPayload(payload: Record<string, unknown>): Record<string, unknown> {\n const slim: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(payload)) {\n if (k === 'message' || k === 'taskSummary') {\n slim[k] = typeof v === 'string' && v.length > 200 ? v.slice(0, 200) + '…' : v;\n } else if (k === 'evidence' || k === 'workerResult' || k === 'gitStatus' || k === 'validationResults') {\n // Skip large nested evidence objects — accessible via mesh_reconcile_ledger if needed.\n } else if (k === 'finalSummary') {\n slim[k] = typeof v === 'string' && v.length > 300 ? v.slice(0, 300) + '…' : v;\n } else if (LARGE_LEDGER_FIELD_KEYS.has(k)) {\n // plan / validationPlan / suggestedConfig / nested payload — these are the\n // refine_batch task_dispatched offenders that blow past the token limit.\n slim[k] = summarizeLargeLedgerField(k, v);\n } else {\n // Primary, key-agnostic defense: elide any oversized nested evidence blob\n // (validationSummary, result, patchEquivalence, submoduleReachability, and\n // any future large key) by serialized byte size. Small scalars/short fields\n // are returned as-is.\n slim[k] = elideLargeNestedValue(k, v);\n }\n }\n return slim;\n}\n\nexport function readRelatedRepos(node: LocalMeshNodeEntry): RepoMeshRelatedRepo[] {\n const raw = Array.isArray((node as any).relatedRepos)\n ? (node as any).relatedRepos\n : Array.isArray((node.policy as any)?.relatedRepos)\n ? (node.policy as any).relatedRepos\n : [];\n\n return raw\n .map((entry: any) => ({\n label: typeof entry?.label === 'string' ? entry.label.trim() : '',\n workspace: typeof entry?.workspace === 'string' ? entry.workspace.trim() : '',\n }))\n .filter((entry: RepoMeshRelatedRepo) => Boolean(entry.label && entry.workspace));\n}\n\nexport function summarizeRelatedRepoStatus(repo: RepoMeshRelatedRepo, status: any): Record<string, unknown> {\n const dirty = isGitStatusDirty(status);\n return {\n label: repo.label,\n workspace: repo.workspace,\n isGitRepo: status?.isGitRepo === true,\n branch: status?.branch ?? null,\n upstream: status?.upstream ?? null,\n upstreamStatus: typeof status?.upstreamStatus === 'string' ? status.upstreamStatus : (status?.upstream ? 'unchecked' : 'no_upstream'),\n upstreamFetchedAt: Number.isFinite(Number(status?.upstreamFetchedAt)) ? Number(status.upstreamFetchedAt) : null,\n upstreamFetchError: typeof status?.upstreamFetchError === 'string' ? status.upstreamFetchError : null,\n ahead: Number.isFinite(Number(status?.ahead)) ? Number(status.ahead) : 0,\n behind: Number.isFinite(Number(status?.behind)) ? Number(status.behind) : 0,\n dirty,\n uncommittedChanges: countUncommittedChanges(status),\n head: status?.headCommit ?? null,\n lastCommitSummary: status?.headMessage ?? null,\n ...(status?.reason ? { reason: status.reason } : {}),\n ...(status?.error ? { error: status.error } : {}),\n };\n}\n\nexport async function collectRelatedRepoStatuses(ctx: MeshContext, node: LocalMeshNodeEntry): Promise<Array<Record<string, unknown>>> {\n const relatedRepos = readRelatedRepos(node);\n if (!relatedRepos.length) return [];\n\n const results: Array<Record<string, unknown>> = [];\n for (const repo of relatedRepos) {\n try {\n const statusResult = await commandForNode(ctx, node, 'git_status', { workspace: repo.workspace, refreshUpstream: true });\n const status = extractGitStatus(statusResult);\n results.push(summarizeRelatedRepoStatus(repo, status));\n } catch (e: any) {\n results.push({\n label: repo.label,\n workspace: repo.workspace,\n error: e?.message || 'related repo status failed',\n });\n }\n }\n return results;\n}\n\nexport function findNodeByWorkspace(mesh: LocalMeshEntry, workspace: string): LocalMeshNodeEntry {\n const node = mesh.nodes.find(n => n.workspace === workspace);\n if (!node) throw new Error(`Workspace '${workspace}' is not a member of mesh '${mesh.name}'`);\n return node;\n}\n\nexport function readProviderPriority(policy: unknown): string[] {\n const raw = (policy as any)?.providerPriority;\n return Array.isArray(raw)\n ? raw.map((type: unknown) => typeof type === 'string' ? type.trim() : '').filter(Boolean)\n : [];\n}\n\n\n/**\n * Surface the capability tags a node can match against required_tags routing,\n * plus its operator-defined capability labels. Computed via the same\n * buildMeshNodeCapabilityTags the queue/dispatch matcher uses, so what the\n * coordinator sees is exactly what routing will match.\n *\n * - capabilityTags: the representative tag set (os=/arch=/converge= plus the\n * first declared provider's provider= tag and any worktree= tag). This is\n * what nodeSatisfiesRequiredTags compares against when no provider is pinned.\n * - capabilityTagsByProvider: per-provider tag sets, one per entry in the\n * node's providerPriority — the provider= tag differs by provider, so a tag\n * like provider=codex-cli only matches when that provider is launchable here.\n * - capabilities: the operator-defined capability labels persisted on the node\n * (already folded into capabilityTags; surfaced raw so operators can see\n * which tags they configured vs. which are auto-advertised).\n *\n * Note: os=/arch= reflect the TARGET node's own machine — for remote member\n * nodes these come from the platform/arch the member daemon stamped into its\n * node record at join time (node.userOverrides.platform/arch), falling back to\n * the local process platform/arch only for the coordinator's own / local\n * worktree nodes. This matches the matcher's behavior, so the exposed set is a\n * faithful preview of routing, not an independent re-derivation.\n */\nexport function buildNodeCapabilityExposure(node: LocalMeshNodeEntry): {\n capabilityTags: string[];\n capabilityTagsByProvider?: Record<string, string[]>;\n capabilities?: string[];\n} {\n const providers = readProviderPriority(node.policy);\n const capabilityTags = buildMeshNodeCapabilityTags(node);\n const exposure: {\n capabilityTags: string[];\n capabilityTagsByProvider?: Record<string, string[]>;\n capabilities?: string[];\n } = { capabilityTags };\n if (providers.length) {\n const byProvider: Record<string, string[]> = {};\n for (const provider of providers) {\n byProvider[provider] = buildMeshNodeCapabilityTags(node, provider);\n }\n exposure.capabilityTagsByProvider = byProvider;\n }\n const capabilities = Array.isArray(node.capabilities)\n ? node.capabilities.filter((tag): tag is string => typeof tag === 'string' && !!tag.trim())\n : [];\n if (capabilities.length) exposure.capabilities = capabilities;\n return exposure;\n}\n\nexport function readSpawnedSessionVisibility(policy: unknown): 'visible' | 'hidden' {\n return (policy as any)?.spawnedSessionVisibility === 'hidden' ? 'hidden' : 'visible';\n}\n\nexport function missingProviderPriorityMessage(nodeId: string): string {\n return `Node '${nodeId}' has no providerPriority policy; pass type explicitly or configure node.policy.providerPriority`;\n}\n\nexport function getNodeLaunchReadiness(node: LocalMeshNodeEntry): Record<string, unknown> {\n const bootstrap = (node as any).worktreeBootstrap;\n if ((node as any).isLocalWorktree && bootstrap?.status === 'failed' && bootstrap?.required !== false) {\n return {\n providerPriority: readProviderPriority(node.policy),\n launchReady: false,\n launchBlockedReason: 'worktree_bootstrap_failed',\n launchBlockedMessage: typeof bootstrap.error === 'string' && bootstrap.error.trim()\n ? bootstrap.error.trim()\n : 'Required worktree bootstrap failed; resolve it before launching an agent into this node.',\n worktreeBootstrap: bootstrap,\n };\n }\n\n const providerPriority = readProviderPriority(node.policy);\n if (providerPriority.length) {\n return {\n providerPriority,\n launchReady: true,\n };\n }\n\n return {\n providerPriority,\n launchReady: false,\n launchBlockedReason: 'missing_provider_priority',\n launchBlockedMessage: missingProviderPriorityMessage(node.id),\n };\n}\n\nexport function getWorktreeBootstrapLaunchBlock(node: LocalMeshNodeEntry, meshPolicy?: unknown): Record<string, unknown> | undefined {\n if (!(node as any).isLocalWorktree) return undefined;\n const bootstrap = (node as any).worktreeBootstrap;\n\n // M2-4 (opt-in): with policy.requireBootstrapBeforeLaunch, any non-ready\n // bootstrap state blocks the launch fail-closed - not just failures.\n const requireReady = !!(meshPolicy && typeof meshPolicy === 'object'\n && (meshPolicy as Record<string, unknown>).requireBootstrapBeforeLaunch === true);\n if (requireReady && bootstrap?.status !== 'ready') {\n return {\n success: false,\n code: 'bootstrap_not_ready',\n error: `Node '${node.id}' bootstrap state is '${bootstrap?.status ?? 'unknown'}' and mesh policy requireBootstrapBeforeLaunch is enabled.`,\n nodeId: node.id,\n worktreeBootstrap: bootstrap ?? null,\n recoveryHint: 'Run the worktree bootstrap (clone runOnClone or a refine with bootstrap inherit) until the node reports ready, or disable requireBootstrapBeforeLaunch.',\n };\n }\n\n if (bootstrap?.status !== 'failed' || bootstrap?.required === false) return undefined;\n return {\n success: false,\n code: 'worktree_bootstrap_failed',\n error: typeof bootstrap.error === 'string' && bootstrap.error.trim()\n ? bootstrap.error.trim()\n : `Node '${node.id}' has a failed required worktree bootstrap.`,\n nodeId: node.id,\n worktreeBootstrap: bootstrap,\n recoveryHint: 'Fix the configured worktree bootstrap command or remove/recreate the worktree node before launching an agent.',\n };\n}\n\nexport async function collectLiveStatusSessions(ctx: MeshContext, node: LocalMeshNodeEntry): Promise<any[]> {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n return extractStatusMetadataSessions(statusResult);\n } catch {\n return [];\n }\n}\n\n\n/**\n * One get_status_metadata probe → both the live session list and the daemon's\n * build stamp. Used by mesh_status so a single daemon-wide probe yields the\n * sessions AND the `daemonBuild` field (commit/version of the running daemon).\n */\nexport async function collectLiveStatusProbe(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n): Promise<{ sessions: any[]; daemonBuild?: { commit: string; commitShort: string; version: string; builtAt?: string } }> {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n return {\n sessions: extractStatusMetadataSessions(statusResult),\n daemonBuild: extractDaemonBuildInfo(statusResult),\n };\n } catch {\n return { sessions: [] };\n }\n}\n\nexport function extractDaemonBuildInfo(value: any): { commit: string; commitShort: string; version: string; builtAt?: string } | undefined {\n const payload = unwrapCommandPayload(value);\n const build = payload?.daemonBuild && typeof payload.daemonBuild === 'object'\n ? payload.daemonBuild\n : (value?.daemonBuild && typeof value.daemonBuild === 'object' ? value.daemonBuild : undefined);\n if (!build) return undefined;\n const commit = readString(build.commit);\n if (!commit) return undefined;\n return {\n commit,\n commitShort: readString(build.commitShort) || commit.slice(0, 7),\n version: readString(build.version) || 'unknown',\n ...(readString(build.builtAt) ? { builtAt: readString(build.builtAt) } : {}),\n };\n}\n\nexport async function collectMeshViewQueueNodesWithLiveSessions(ctx: MeshContext): Promise<any[]> {\n const nodes = await Promise.all(ctx.mesh.nodes.map(async (node) => {\n const liveSessions = await collectLiveStatusSessions(ctx, node);\n return liveSessions.length > 0\n ? { ...node, sessions: liveSessions }\n : node;\n }));\n return nodes;\n}\n\nexport function buildBranchConvergence(\n mesh: LocalMeshEntry,\n node: LocalMeshNodeEntry,\n status: any,\n dirty: boolean,\n uncommittedChanges: number,\n): Record<string, unknown> {\n const defaultBranch = readString(mesh.defaultBranch) ?? 'main';\n const branch = readString(status?.branch) ?? readString(node.worktreeBranch) ?? null;\n const ahead = readNumeric(status?.ahead);\n const behind = readNumeric(status?.behind);\n const upstream = readString(status?.upstream) ?? null;\n const upstreamStatus = readString(status?.upstreamStatus) ?? (upstream ? 'unchecked' : 'no_upstream');\n const hasConflicts = status?.hasConflicts === true || (Array.isArray(status?.conflictFiles) && status.conflictFiles.length > 0);\n const base = {\n defaultBranch,\n branch,\n upstream,\n upstreamStatus,\n ahead,\n behind,\n isWorktree: node.isLocalWorktree === true,\n isDefaultBranch: branch === defaultBranch,\n };\n\n if (status?.isGitRepo !== true) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'git_status_unavailable',\n nextStep: `Resolve git status for node '${node.id}' before marking the task complete.`,\n };\n }\n\n if (!branch) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'branch_unknown',\n nextStep: `Inspect node '${node.id}' git branch before deciding whether it is merged to ${defaultBranch}.`,\n };\n }\n\n if (hasConflicts || dirty || uncommittedChanges > 0) {\n return {\n ...base,\n status: 'not_mergeable',\n needsConvergence: true,\n reason: hasConflicts ? 'conflicts_present' : 'dirty_workspace',\n nextStep: `Commit, checkpoint, or resolve node '${node.id}' before any main convergence step.`,\n };\n }\n\n if (branch === defaultBranch) {\n if (upstream && upstreamStatus !== 'fresh') {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'default_branch_upstream_unverified',\n nextStep: `Refresh ${defaultBranch}'s upstream refs or resolve the fetch failure before declaring convergence complete for node '${node.id}'.`,\n };\n }\n if (ahead > 0 || behind > 0) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'default_branch_not_even_with_upstream',\n nextStep: `Bring ${defaultBranch} even with its upstream before declaring convergence complete.`,\n };\n }\n return {\n ...base,\n status: 'merged_to_main',\n needsConvergence: false,\n reason: 'clean_default_branch',\n nextStep: null,\n };\n }\n\n if (node.isLocalWorktree) {\n return {\n ...base,\n status: 'cleanup_candidate',\n needsConvergence: true,\n reason: 'clean_non_default_worktree_branch',\n nextStep: `Run mesh_refine_node(node_id: \"${node.id}\") or explicitly classify this worktree as blocked_review/not_mergeable before ending the task.`,\n };\n }\n\n if (upstream && upstreamStatus !== 'fresh') {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'feature_branch_upstream_unverified',\n nextStep: `Refresh branch '${branch}' upstream refs or resolve the fetch failure before deciding whether it is ready to merge into ${defaultBranch}.`,\n };\n }\n\n if (!upstream || ahead > 0 || behind > 0) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: !upstream ? 'feature_branch_missing_upstream' : 'feature_branch_not_even_with_upstream',\n nextStep: `Push or reconcile branch '${branch}', then merge it into ${defaultBranch} or mark it not_mergeable with a reason.`,\n };\n }\n\n return {\n ...base,\n status: 'pushed_feature_branch_needs_merge',\n needsConvergence: true,\n reason: 'clean_non_default_branch',\n nextStep: `Review and merge branch '${branch}' into ${defaultBranch}; do not report the task as fully complete while it remains off main.`,\n };\n}\n\n\n// In compact mode the per-node followUp rows are capped so this summary can't grow\n// unbounded with node count; the dropped rows are folded into a by-status count and\n// the full list stays available via verbose.\nexport const COMPACT_MAX_CONVERGENCE_FOLLOWUPS = 12;\n\nexport function summarizeBranchConvergence(nodes: any[], compact = false): Record<string, unknown> {\n const allFollowUps = nodes\n .filter(node => node?.branchConvergence?.needsConvergence === true)\n .map(node => ({\n nodeId: node.nodeId,\n // workspace is a long absolute path redundant with nodeId — drop it in\n // compact mode to keep this summary bounded.\n ...(compact ? {} : { workspace: node.workspace }),\n branch: node.branchConvergence.branch,\n status: node.branchConvergence.status,\n reason: node.branchConvergence.reason,\n // The per-node nextStep is long prose that repeats node ids/branch names.\n // In compact mode drop it (the status+reason carry the actionable signal;\n // verbose still surfaces the full nextStep) so this summary stays bounded\n // as node count grows.\n ...(compact ? {} : { nextStep: node.branchConvergence.nextStep }),\n }));\n\n const byStatus: Record<string, number> = {};\n for (const f of allFollowUps) {\n const s = typeof f.status === 'string' ? f.status : 'unknown';\n byStatus[s] = (byStatus[s] ?? 0) + 1;\n }\n\n const followUps = compact ? allFollowUps.slice(0, COMPACT_MAX_CONVERGENCE_FOLLOWUPS) : allFollowUps;\n const omitted = allFollowUps.length - followUps.length;\n\n return {\n needsFollowUp: allFollowUps.length > 0,\n unresolvedCount: allFollowUps.length,\n byStatus,\n requiredFinalStates: ['merged_to_main', 'pushed_feature_branch_needs_merge', 'blocked_review', 'cleanup_candidate', 'not_mergeable'],\n followUps,\n ...(omitted > 0 ? { followUpsOmitted: omitted, followUpsHint: 'Per-node followUp rows are capped in compact mode; counts above are complete. Use verbose=true for the full list.' } : {}),\n };\n}\n\nexport async function commandForNode(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n command: string,\n args: Record<string, unknown> = {},\n): Promise<any> {\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n\n if (ctx.transport instanceof IpcTransport && node.daemonId && !isLocalNode) {\n return ctx.transport.meshCommand(node.daemonId, command, args);\n }\n return ctx.transport.command(command, args);\n}\n\nexport function normalizePendingMeshCoordinatorEvents(value: any): any[] {\n const payload = unwrapCommandPayload(value);\n const events = Array.isArray(payload?.events)\n ? payload.events\n : Array.isArray(value?.events)\n ? value.events\n : [];\n return events.filter((event: unknown) => event && typeof event === 'object');\n}\n\nexport function buildMeshForwardPayloadFromPendingEvent(event: any): Record<string, unknown> {\n const metadataEvent = event?.metadataEvent && typeof event.metadataEvent === 'object'\n ? event.metadataEvent as Record<string, unknown>\n : {};\n return {\n event: readString(event?.event),\n meshId: readString(event?.meshId),\n nodeId: readString(event?.nodeId) || readString(metadataEvent.meshNodeId),\n workspace: readString(event?.workspace) || readString(metadataEvent.workspace),\n targetSessionId: readString(metadataEvent.targetSessionId) || readString(metadataEvent.sessionId) || readString(metadataEvent.instanceId),\n providerType: readString(metadataEvent.providerType),\n providerSessionId: readString(metadataEvent.providerSessionId),\n finalSummary: readString(metadataEvent.finalSummary) || readString(metadataEvent.summary),\n jobId: readString(metadataEvent.jobId),\n interactionId: readString(metadataEvent.interactionId),\n status: readString(metadataEvent.status),\n targetDaemonId: readString(metadataEvent.targetDaemonId),\n startedAt: readString(metadataEvent.startedAt),\n completedAt: readString(metadataEvent.completedAt),\n retryOfJobId: readString(metadataEvent.retryOfJobId),\n ...(metadataEvent.result && typeof metadataEvent.result === 'object' && !Array.isArray(metadataEvent.result) ? { result: metadataEvent.result } : {}),\n ...(metadataEvent.intentional === true ? { intentional: true } : {}),\n ...(metadataEvent.intentionalStop === true ? { intentionalStop: true } : {}),\n ...(metadataEvent.operatorCleanup === true ? { operatorCleanup: true } : {}),\n ...(readString(metadataEvent.reason) ? { reason: readString(metadataEvent.reason) } : {}),\n ...(readString(metadataEvent.stopReason) ? { stopReason: readString(metadataEvent.stopReason) } : {}),\n ...(readString(metadataEvent.cleanupReason) ? { cleanupReason: readString(metadataEvent.cleanupReason) } : {}),\n ...(readString(metadataEvent.source) ? { source: readString(metadataEvent.source) } : {}),\n };\n}\n\nexport async function drainCoordinatorPendingEvents(\n ctx: MeshContext,\n opts?: { nodeIds?: string[] },\n): Promise<any[]> {\n const requestedNodeIds = opts?.nodeIds?.length ? new Set(opts.nodeIds) : null;\n const matchesCurrentMesh = (event: any) => readString(event?.meshId) === ctx.mesh.id;\n\n if (ctx.transport instanceof IpcTransport) {\n const surfacedEvents: any[] = [];\n const coordinatorDaemonId = readString(ctx.localDaemonId);\n const pendingEventArgs = {\n meshId: ctx.mesh.id,\n ...(coordinatorDaemonId ? { coordinatorDaemonId } : {}),\n };\n\n try {\n const localEvents = normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', pendingEventArgs) as any)\n .filter(matchesCurrentMesh);\n for (const event of localEvents) {\n const payload = buildMeshForwardPayloadFromPendingEvent(event);\n if (!payload.event || !payload.meshId) continue;\n let injected = false;\n try {\n await ctx.transport.command('mesh_forward_event', payload);\n injected = true;\n } catch { /* best-effort */ }\n rememberMeshSessionProviderMetadataFromEvent({ ...event, metadataEvent: payload });\n if (!injected) surfacedEvents.push(event);\n }\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n for (const node of ctx.mesh.nodes) {\n if (!node.daemonId || isLocalControlPlaneNode(ctx, node)) continue;\n if (requestedNodeIds && !requestedNodeIds.has(node.id)) continue;\n\n try {\n const remoteEvents = normalizePendingMeshCoordinatorEvents(\n await ctx.transport.meshCommand(node.daemonId, 'get_pending_mesh_events', pendingEventArgs),\n ).filter(matchesCurrentMesh);\n if (remoteEvents.length === 0) continue;\n\n for (const event of remoteEvents) {\n const payload = buildMeshForwardPayloadFromPendingEvent(event);\n if (!payload.event || !payload.meshId) continue;\n await ctx.transport.command('mesh_forward_event', payload);\n rememberMeshSessionProviderMetadataFromEvent({ ...event, metadataEvent: payload });\n }\n } catch {\n // Non-fatal: remote pending-event recovery is best-effort.\n }\n }\n\n try {\n const localEvents = normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', pendingEventArgs) as any)\n .filter(matchesCurrentMesh);\n for (const event of localEvents) {\n const payload = buildMeshForwardPayloadFromPendingEvent(event);\n if (!payload.event || !payload.meshId) continue;\n let injected = false;\n try {\n await ctx.transport.command('mesh_forward_event', payload);\n injected = true;\n } catch { /* best-effort */ }\n rememberMeshSessionProviderMetadataFromEvent({ ...event, metadataEvent: payload });\n if (!injected) surfacedEvents.push(event);\n }\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n return surfacedEvents;\n }\n\n // (B3) Pass localDaemonId so unicast events targeted at other\n // coordinators are skipped (and requeued) instead of being silently\n // consumed by this MCP. drainPendingMeshCoordinatorEvents already\n // accepts the second arg in the base; we were the missing wiring.\n const events = (drainPendingMeshCoordinatorEvents(ctx.mesh.id, ctx.localDaemonId) as any[]).filter(matchesCurrentMesh);\n events.forEach(rememberMeshSessionProviderMetadataFromEvent);\n return events;\n}\n\nexport function isP2pTransportUnavailableError(error: unknown): boolean {\n return isP2pRelayTransportFailure(error);\n}\n\nexport function buildRemoveNodeArgs(ctx: MeshContext, nodeId: string, sessionCleanupMode?: string, force?: boolean): Record<string, unknown> {\n return {\n meshId: ctx.mesh.id,\n nodeId,\n ...(sessionCleanupMode ? { sessionCleanupMode } : {}),\n ...(force === true ? { force: true } : {}),\n inlineMesh: ctx.mesh,\n };\n}\n\n\n/**\n * Distinguish a P2P read_chat transport failure between \"the peer is reachable but\n * saturated/slow\" (REQUEST_TIMEOUT — acked, result deadline elapsed) and \"the peer was\n * never connected / the request never reached a working handler\" (CONNECT_TIMEOUT,\n * ACK_TIMEOUT delivery failure, NO_PEER, datachannel closed, …). Both still warrant the\n * cached-summary fallback, but the advisory wording differs so the coordinator knows\n * whether a quick retry is plausible (saturated) or the daemon is simply offline.\n *\n * The transport-layer code (meshCode) is lost crossing IPC — only the error message\n * string survives — so classification is by message text.\n */\nexport function classifyReadChatTransportCause(error: unknown): 'not_connected' | 'saturated' {\n const message = (error instanceof Error ? error.message : String(error ?? '')).toLowerCase();\n if (/not acknowledged|delivery failure|channel never opened|connect timed out|not connected|datachannel|disconnected|\\bclosed\\b|offline|no route|failed to initiate p2p|p2p mesh is not available|connect queue full/.test(message)) {\n return 'not_connected';\n }\n // Acked but the result deadline elapsed (REQUEST_TIMEOUT) — peer reachable but\n // saturated / still working and could not return the transcript in time.\n return 'saturated';\n}\n\n\n/**\n * The coordinator already holds the worker's latest assistant text from the completion /\n * status events it surfaced into the ledger (finalSummary / workerResult.summary — the\n * same fields resolveMeshSurfacedSessionPreview reads off a live event, and the same\n * data the mobile inbox is fed). When the live P2P read_chat path is unavailable this\n * resolves that cached preview so mesh_read_chat can degrade to a stale-but-present\n * summary instead of a hard 30s timeout. Scans the most recent matching ledger entry for\n * the node+session.\n */\nexport function resolveCachedMeshSessionPreviewFromLedger(\n ctx: MeshContext,\n nodeId: string,\n sessionId: string,\n): { preview: string; role: 'assistant'; receivedAt: number; ledgerKind: string; timestamp: string } | undefined {\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n const payload = entry.payload && typeof entry.payload === 'object' && !Array.isArray(entry.payload)\n ? entry.payload as Record<string, unknown>\n : {};\n const entryNodeId = readString(entry.nodeId) || readString(payload.nodeId) || readString(payload.meshNodeId);\n if (entryNodeId && entryNodeId !== nodeId) continue;\n const entrySessionId = readString(entry.sessionId)\n || readString(payload.targetSessionId)\n || readString(payload.sessionId)\n || readString(payload.instanceId);\n if (entrySessionId !== sessionId) continue;\n // Prefer a nested metadataEvent when present, else read the entry payload itself\n // (task_completed / task_failed entries carry finalSummary + workerResult inline).\n const metadataEvent = payload.metadataEvent && typeof payload.metadataEvent === 'object' && !Array.isArray(payload.metadataEvent)\n ? payload.metadataEvent as Record<string, unknown>\n : payload;\n const preview = resolveMeshSurfacedSessionPreview(metadataEvent);\n if (preview) {\n return { ...preview, ledgerKind: entry.kind, timestamp: entry.timestamp };\n }\n }\n return undefined;\n}\n\n\n/**\n * mesh_read_chat fallback for a REMOTE P2P read that failed at the transport layer.\n *\n * Mirrors mesh_status's collectLiveStatusProbe graceful-degrade pattern: rather than\n * hard-failing on a 30s P2P timeout to a saturated/unreachable worker, surface the\n * cached coordinator-side summary (the same finalSummary/lastMessagePreview the mobile\n * dashboard renders). This is a READ/meta-plane degrade — status & preview already flow\n * over the WS/event plane — NOT a data-plane command WS fallback (which stays P2P-only\n * by policy). The full transcript still requires a live P2P read_chat; the fallback is\n * explicitly a stale point-in-time summary only.\n */\nexport function buildMeshReadChatCacheFallback(\n ctx: MeshContext,\n args: { node_id: string; session_id: string },\n node: LocalMeshNodeEntry,\n error: unknown,\n): string {\n const classification = classifyP2pRelayFailure(error, { command: 'read_chat', targetDaemonId: node.daemonId });\n const cause = classifyReadChatTransportCause(error);\n const errorMessage = error instanceof Error ? error.message : String(error ?? '');\n const causeNote = cause === 'not_connected'\n ? 'the worker daemon is not currently connected over P2P (no live channel)'\n : 'the worker daemon is connected but saturated — it acknowledged the request but did not return the transcript within the deadline';\n\n const cached = resolveCachedMeshSessionPreviewFromLedger(ctx, args.node_id, args.session_id);\n if (cached) {\n return JSON.stringify({\n success: true,\n source: 'coordinator_cache_fallback',\n fallback: true,\n nodeId: args.node_id,\n sessionId: args.session_id,\n transport: 'p2p',\n transportFailure: {\n code: classification.code,\n reason: classification.reason,\n cause,\n error: errorMessage,\n },\n advisory: `Live transcript unavailable (${causeNote}). Showing the cached coordinator-side summary surfaced from the worker's last completion/status event — a stale point-in-time summary, NOT the live transcript. The full transcript requires a live P2P read_chat once the peer is reachable.`,\n fullTranscriptRequiresP2p: true,\n summary: cached.preview,\n messages: [{\n role: cached.role,\n content: cached.preview,\n cached: true,\n ...(cached.receivedAt ? { receivedAt: cached.receivedAt } : {}),\n }],\n cachedPreview: {\n role: cached.role,\n ledgerKind: cached.ledgerKind,\n ledgerTimestamp: cached.timestamp,\n ...(cached.receivedAt ? { receivedAt: cached.receivedAt } : {}),\n },\n }, null, 2);\n }\n\n // No cached summary either — return the structured relay failure with a clear reason,\n // and make explicit that even a fallback summary is unavailable.\n const failure = buildCoordinatorP2pRelayFailure(error, {\n command: 'read_chat',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n sessionId: args.session_id,\n });\n return JSON.stringify({\n ...failure,\n cause,\n cachedSummaryAvailable: false,\n fullTranscriptRequiresP2p: true,\n advisory: `Live transcript unavailable (${causeNote}) and no cached coordinator-side summary exists for this session yet (no completion/status event has been surfaced). The full transcript requires a live P2P read_chat once the peer is reachable.`,\n }, null, 2);\n}\n\nexport function resolveRefineConfigNode(ctx: MeshContext, nodeId?: string): LocalMeshNodeEntry {\n if (nodeId) return findNode(ctx.mesh, nodeId);\n const node = ctx.mesh.nodes.find((entry: LocalMeshNodeEntry) => !!entry.workspace);\n if (!node) throw new Error('No mesh node with a workspace is available');\n return node;\n}\n","/**\n * Shared low-level helpers and constants for the mesh_* tool family.\n *\n * Leaf module: depends only on daemon-core/mesh-shared (never on mesh-tools.ts or\n * any of the split-out cluster files), so the cluster files (mesh-compact.ts,\n * mesh-queue-helpers.ts, mesh-node-identity.ts) and mesh-tools.ts can all import\n * from here without a runtime import cycle. Physically split out of mesh-tools.ts\n * (RF-SURVEY candidate C1) with no behavior change — same function bodies, same\n * constant values.\n */\n\nexport function readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport function readNumeric(value: unknown, fallback = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\n// ─── Large-value / ledger-field compaction (shared by queue + compact + ledger) ───\n\nexport const LARGE_LEDGER_FIELD_KEYS = new Set(['plan', 'validationPlan', 'suggestedConfig', 'payload']);\nconst LARGE_LEDGER_OBJECT_THRESHOLD = 800;\n// Any nested object/array in a compact payload whose serialized size exceeds this\n// is replaced with an elided placeholder. This is the PRIMARY defense: it covers\n// arbitrary evidence keys (validationSummary, result, patchEquivalence,\n// submoduleReachability, plus any future key) without a hardcoded allowlist. The\n// specific per-key rules below are just tuning on top of this general guard.\nconst LARGE_LEDGER_NESTED_BYTES_THRESHOLD = 2000;\n\nexport function summarizeLargeLedgerField(key: string, value: unknown): unknown {\n if (typeof value === 'string') {\n return value.length > 500 ? value.slice(0, 500) + '…' : value;\n }\n if (Array.isArray(value)) {\n const serialized = JSON.stringify(value);\n if (serialized && serialized.length > LARGE_LEDGER_OBJECT_THRESHOLD) {\n return `[${key} summarized: ${value.length} items — use verbose=true or mesh_reconcile_ledger]`;\n }\n return value;\n }\n if (value && typeof value === 'object') {\n const serialized = JSON.stringify(value);\n if (serialized && serialized.length > LARGE_LEDGER_OBJECT_THRESHOLD) {\n return `[${key} summarized: ${Object.keys(value as Record<string, unknown>).length} keys — use verbose=true or mesh_reconcile_ledger]`;\n }\n return value;\n }\n return value;\n}\n\n// Generic nested-value guard. Replaces any object/array (or oversized string) whose\n// serialized size exceeds LARGE_LEDGER_NESTED_BYTES_THRESHOLD with a compact\n// placeholder that records the original key, byte size, and a recovery hint. Small\n// scalars and short fields (source, success, async, into, mergedBranch, …) pass\n// through untouched.\nexport function elideLargeNestedValue(key: string, value: unknown): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'string') {\n // Long bare strings (not one of the explicitly-capped fields) get a hard cap\n // so a single multi-KB string blob can't blow the payload either.\n return value.length > 1000 ? value.slice(0, 1000) + '…' : value;\n }\n if (typeof value !== 'object') return value; // number / boolean\n const serialized = JSON.stringify(value);\n const bytes = serialized ? serialized.length : 0;\n if (bytes <= LARGE_LEDGER_NESTED_BYTES_THRESHOLD) return value;\n return {\n _elided: true,\n _kind: key,\n _bytes: bytes,\n _hint: 'full evidence via mesh_reconcile_ledger',\n };\n}\n","/**\n * Session / command-payload record helpers for the mesh_* tools.\n *\n * Leaf module: depends only on mesh-tool-shared (readString). Holds the shared\n * session-record readers/classifiers (id/provider/coordinator/unmanaged/terminal/\n * idle), the node session-id collector, and the command-payload unwrapper.\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change — same function bodies. mesh-tools.ts and the queue/compact cluster files\n * import these back, so there is no runtime import cycle.\n */\nimport { readString } from './mesh-tool-shared.js';\n\nexport function readSessionRecordId(session: any): string | undefined {\n return readString(session?.id)\n || readString(session?.sessionId)\n || readString(session?.session_id)\n || readString(session?.runtimeSessionId)\n || readString(session?.runtime_session_id)\n || readString(session?.instanceId)\n || readString(session?.instance_id);\n}\n\nexport function extractStatusMetadataSessions(value: any): any[] {\n const payload = unwrapCommandPayload(value);\n const status = payload?.status && typeof payload.status === 'object'\n ? payload.status\n : payload;\n return Array.isArray(status?.sessions) ? status.sessions : [];\n}\n\nexport function resolveSessionProviderType(session: any): string {\n return readString(session?.providerType)\n || readString(session?.cliType)\n || readString(session?.agentType)\n || '';\n}\n\nexport function isMeshCoordinatorSessionRecord(session: any): boolean {\n return Boolean(\n readString(session?.settings?.meshCoordinatorFor)\n || readString(session?.meta?.meshCoordinatorFor)\n || readString(session?.metadata?.meshCoordinatorFor)\n || readString(session?.meshCoordinatorFor),\n );\n}\n\n/**\n * Returns true when a session has no mesh delegation metadata at all — neither\n * meshNodeFor (worker) nor meshCoordinatorFor (coordinator). Dispatching a\n * worker task to such a session is unsafe: the session may be the coordinator's\n * own CLI session (self-send risk), an unrelated session, or a stale record\n * whose providerSessionId now aliases the coordinator's transcript.\n *\n * The check intentionally fails closed: an explicit delegate session launched\n * via mesh_launch_session always carries meshNodeFor, so any safe target passes.\n */\nexport function isUnmanagedSessionRecord(session: any): boolean {\n const hasMeshNodeFor = Boolean(\n readString(session?.settings?.meshNodeFor)\n || readString(session?.meta?.meshNodeFor)\n || readString(session?.metadata?.meshNodeFor)\n || readString(session?.meshNodeFor),\n );\n if (hasMeshNodeFor) return false;\n if (isMeshCoordinatorSessionRecord(session)) return false;\n // launchedByCoordinator is set by the daemon when it auto-launches a worker\n // session in response to a queue task; treat it as a managed delegate.\n const launchedByCoordinator = Boolean(\n session?.settings?.launchedByCoordinator === true\n || session?.meta?.launchedByCoordinator === true\n || session?.launchedByCoordinator === true,\n );\n return !launchedByCoordinator;\n}\n\nexport function isWorkerTaskMode(taskMode: string | undefined): boolean {\n return taskMode !== 'live_debug_readonly';\n}\n\nfunction addSessionRecord(target: Set<string>, session: any): void {\n if (!session || typeof session !== 'object' || isTerminalSessionRecord(session)) return;\n const sessionId = readSessionRecordId(session);\n if (sessionId) target.add(sessionId);\n}\n\nexport function collectNodeSessionIds(node: any): Set<string> {\n const sessions = new Set<string>();\n const sessionArrays = [\n node?.sessions,\n node?.activeSessions,\n node?.active_sessions,\n node?.lastProbe?.sessions,\n node?.last_probe?.sessions,\n node?.lastProbe?.status?.sessions,\n node?.last_probe?.status?.sessions,\n ];\n for (const value of sessionArrays) {\n if (Array.isArray(value)) value.forEach(session => addSessionRecord(sessions, session));\n }\n\n const sessionRecords = [\n node?.activeSession,\n node?.active_session,\n node?.currentSession,\n node?.current_session,\n node?.runtimeSession,\n node?.runtime_session,\n node?.session,\n node?.lastProbe?.activeSession,\n node?.last_probe?.active_session,\n node?.lastProbe?.currentSession,\n node?.last_probe?.current_session,\n node?.lastProbe?.session,\n node?.last_probe?.session,\n ];\n sessionRecords.forEach(session => addSessionRecord(sessions, session));\n return sessions;\n}\n\nexport function unwrapCommandPayload(value: any): any {\n let current = value;\n const seen = new Set<any>();\n for (let depth = 0; depth < 8; depth += 1) {\n if (!current || typeof current !== 'object' || seen.has(current)) break;\n seen.add(current);\n\n const nested = current.result ?? current.payload;\n if (!nested || typeof nested !== 'object') break;\n current = nested;\n }\n return current;\n}\n\nexport function isTerminalSessionRecord(session: any): boolean {\n const status = typeof session?.status === 'string' ? session.status.toLowerCase() : '';\n const lifecycle = typeof session?.lifecycle === 'string' ? session.lifecycle.toLowerCase() : '';\n const state = typeof session?.state === 'string' ? session.state.toLowerCase() : '';\n return [status, lifecycle, state].some(value => ['stopped', 'failed', 'terminated', 'exited', 'closed'].includes(value));\n}\n\nexport function isIdleSessionRecord(session: any): boolean {\n if (isTerminalSessionRecord(session)) return false;\n const status = typeof session?.status === 'string' ? session.status.toLowerCase() : '';\n const chatStatus = typeof session?.activeChat?.status === 'string' ? session.activeChat.status.toLowerCase() : '';\n return status === 'idle' || chatStatus === 'waiting_input';\n}\n","/**\n * Node identity / locality resolution helpers for the mesh_* tools.\n *\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change. Resolves machine/daemon/hostname identity for a mesh node and decides\n * whether a node is the local control-plane / coordinator node. Imports only leaf\n * deps (mesh-tool-shared, daemon-core) plus the MeshContext type (type-only, so no\n * runtime import cycle); mesh-tools.ts imports the exported helpers back.\n */\nimport { daemonIdsEquivalent, meshNodeIdMatches } from '@adhdev/daemon-core';\nimport type { LocalMeshNodeEntry } from '@adhdev/daemon-core';\nimport { readString } from './mesh-tool-shared.js';\nimport type { MeshContext } from './mesh-tools.js';\n\nexport function resolveCoordinatorNode(ctx: MeshContext): LocalMeshNodeEntry | undefined {\n const preferredNodeId = typeof ctx.mesh.coordinator?.preferredNodeId === 'string'\n ? ctx.mesh.coordinator.preferredNodeId.trim()\n : '';\n if (preferredNodeId) {\n const preferred = ctx.mesh.nodes.find(n => n.id === preferredNodeId && typeof n.daemonId === 'string' && n.daemonId.trim());\n if (preferred) return preferred;\n }\n if (ctx.localMachineId) {\n const byMachine = ctx.mesh.nodes.find(n => readNodeMachineId(n) === ctx.localMachineId);\n if (byMachine) return byMachine;\n }\n if (ctx.localDaemonId) {\n return ctx.mesh.nodes.find(n => readNodeDaemonId(n) === ctx.localDaemonId);\n }\n return undefined;\n}\n\n/**\n * Resolve the coordinator anchor id stamped into a worker dispatch's meshContext\n * (`coordinatorDaemonId`), which the remote router turns into the worker\n * session's `meshCoordinatorDaemonId` relay anchor (router.ts buildMeshWorkerRelayStamp).\n * Without a non-empty value the forwarder gate treats the worker as relay-unsafe\n * and the completion event sits in the pending queue until a later read_chat\n * forces a reconcile.\n *\n * Order: the coordinator mesh node's daemonId → the IPC daemon instanceId\n * (ctx.localDaemonId) → the local machine registry id (ctx.localMachineId). The\n * final fallback mirrors the queue-assignment dispatch path, which stamps\n * `loadConfig().machineId` (== ctx.localMachineId; see server.ts) — so the\n * direct-dispatch path now resolves an anchor whenever the queue path would.\n */\nexport function resolveCoordinatorDaemonId(ctx: MeshContext): string | undefined {\n return readString(resolveCoordinatorNode(ctx)?.daemonId)\n || readString(ctx.localDaemonId)\n || readString(ctx.localMachineId);\n}\n\nexport function readNodeMachineId(node: LocalMeshNodeEntry): string | undefined {\n return readString((node as any).machineId)\n || readString((node as any).machine_id)\n || readString((node as any).machine?.id)\n || readString((node as any).machine?.machineId)\n || readString((node as any).lastProbe?.machineId)\n || readString((node as any).last_probe?.machine_id)\n || readString((node as any).lastProbe?.machine?.id)\n || readString((node as any).lastProbe?.machine?.machineId)\n || readString((node as any).last_probe?.machine?.id)\n || readString((node as any).last_probe?.machine?.machine_id);\n}\n\nexport function readNodeDaemonId(node: LocalMeshNodeEntry): string | undefined {\n return readString(node.daemonId)\n || readString((node as any).daemon_id)\n || readString((node as any).machine?.daemonId)\n || readString((node as any).machine?.daemon_id)\n || readString((node as any).lastProbe?.daemonId)\n || readString((node as any).last_probe?.daemon_id)\n || readString((node as any).lastProbe?.machine?.daemonId)\n || readString((node as any).lastProbe?.machine?.daemon_id)\n || readString((node as any).last_probe?.machine?.daemonId)\n || readString((node as any).last_probe?.machine?.daemon_id);\n}\n\nfunction normalizeHostname(value: unknown): string | undefined {\n const hostname = readString(value);\n if (!hostname) return undefined;\n return hostname.toLowerCase().replace(/\\.$/, '');\n}\n\nfunction readNodeHostname(node: LocalMeshNodeEntry): string | undefined {\n return readString((node as any).hostname)\n || readString((node as any).host)\n || readString((node as any).machineHostname)\n || readString((node as any).machine_hostname)\n || readString((node as any).machine?.hostname)\n || readString((node as any).machine?.host)\n || readString((node as any).lastProbe?.hostname)\n || readString((node as any).last_probe?.hostname)\n || readString((node as any).lastProbe?.machine?.hostname)\n || readString((node as any).last_probe?.machine?.hostname);\n}\n\nfunction readNodeDisplayMachineName(node: LocalMeshNodeEntry): string | undefined {\n return readString((node as any).machineName)\n || readString((node as any).machine_name)\n || readString((node as any).machineLabel)\n || readString((node as any).machine_label)\n || readString((node as any).machineNickname)\n || readString((node as any).machine_nickname)\n || readString((node as any).alias)\n || readString((node as any).machine?.name)\n || readString((node as any).machine?.displayName)\n || readString((node as any).machine?.display_name)\n || readString((node as any).lastProbe?.machineName)\n || readString((node as any).last_probe?.machine_name)\n || readString((node as any).lastProbe?.machine?.name)\n || readString((node as any).last_probe?.machine?.name)\n || readNodeHostname(node);\n}\n\nfunction compactIdentityEvidence(value: string | undefined): string | undefined {\n if (!value) return undefined;\n return value.length > 24 ? `${value.slice(0, 12)}…${value.slice(-8)}` : value;\n}\n\nfunction pushIdentityEvidence(evidence: string[], label: string, value: string | undefined): void {\n const compact = compactIdentityEvidence(value);\n if (compact) evidence.push(`${label}:${compact}`);\n}\n\nexport function buildNodeMachineIdentity(ctx: MeshContext, node: LocalMeshNodeEntry): Record<string, unknown> {\n const machineId = readNodeMachineId(node);\n const daemonId = readNodeDaemonId(node);\n const hostname = readNodeHostname(node);\n const machineName = readNodeDisplayMachineName(node);\n const coordinatorHostname = readString(ctx.coordinatorHostname);\n const localControlPlaneReason = getLocalControlPlaneMatchReason(ctx, node);\n const directLocal = !!localControlPlaneReason;\n const hostnameMatches = Boolean(\n normalizeHostname(hostname)\n && normalizeHostname(coordinatorHostname)\n && normalizeHostname(hostname) === normalizeHostname(coordinatorHostname),\n );\n const sameMachine = directLocal || hostnameMatches;\n const evidence: string[] = [];\n pushIdentityEvidence(evidence, 'machineName', machineName);\n pushIdentityEvidence(evidence, 'hostname', hostname);\n pushIdentityEvidence(evidence, 'machineId', machineId);\n pushIdentityEvidence(evidence, 'daemonId', daemonId);\n if (localControlPlaneReason) {\n pushIdentityEvidence(evidence, 'localMatch', localControlPlaneReason);\n pushIdentityEvidence(evidence, 'localMachineId', ctx.localMachineId);\n pushIdentityEvidence(evidence, 'localDaemonId', ctx.localDaemonId);\n }\n const locality = sameMachine ? 'same_machine' : (evidence.length > 0 ? 'remote_known' : 'remote_or_unknown');\n const localityReason = sameMachine\n ? (localControlPlaneReason || 'matched coordinator hostname')\n : evidence.length > 0\n ? `known remote/other machine identity; no local coordinator match (${evidence.join(', ')})`\n : 'no useful machine identity evidence available';\n return {\n daemonId,\n machineId,\n hostname,\n machineName,\n displayName: machineName || hostname || daemonId || machineId,\n coordinatorHostname,\n sameMachine,\n locality,\n localityReason,\n identityEvidence: evidence,\n };\n}\n\nfunction nodeHasLocalDaemonEvidence(ctx: MeshContext, node: any): boolean {\n const isLocal = (session: any) => {\n if (!session || typeof session !== 'object') return false;\n // meshCoordinatorDaemonId identifies where a worker should relay completion events.\n // Remote workers also point this at the local coordinator, so it is not locality evidence.\n // Likewise launchedByCoordinator only proves the coordinator created the session, not\n // that the session is running on this daemon.\n // runtime.owner / daemonClient.daemonId and ctx.localDaemonId may carry\n // interchangeable id forms (bare mach_ / daemon_mach_ / standalone_mach_), so\n // compare under canonical machine-core form rather than a raw ===; a form\n // mismatch would otherwise drop valid local-daemon evidence.\n if (ctx.localDaemonId && daemonIdsEquivalent(session.runtime?.owner, ctx.localDaemonId)) return true;\n if (ctx.localDaemonId && daemonIdsEquivalent(session.daemonClient?.daemonId, ctx.localDaemonId)) return true;\n return false;\n };\n\n const sessionArrays = [\n node?.sessions,\n node?.activeSessions,\n node?.active_sessions,\n node?.lastProbe?.sessions,\n node?.last_probe?.sessions,\n node?.lastProbe?.status?.sessions,\n node?.last_probe?.status?.sessions,\n ];\n for (const arr of sessionArrays) {\n if (Array.isArray(arr) && arr.some(isLocal)) return true;\n }\n\n const sessionRecords = [\n node?.activeSession,\n node?.active_session,\n node?.currentSession,\n node?.current_session,\n node?.runtimeSession,\n node?.runtime_session,\n node?.session,\n node?.lastProbe?.activeSession,\n node?.last_probe?.active_session,\n node?.lastProbe?.currentSession,\n node?.last_probe?.current_session,\n node?.lastProbe?.session,\n node?.last_probe?.session,\n ];\n for (const session of sessionRecords) {\n if (isLocal(session)) return true;\n }\n \n return false;\n}\n\nfunction isDirectLocalNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n const machineId = readNodeMachineId(node);\n const daemonId = readNodeDaemonId(node);\n // id-form robust: a node's daemon/machine id may be stored in a DIFFERENT form\n // (bare `mach_X` vs `daemon_mach_X` vs `standalone_mach_X`) than the coordinator's\n // resolved ctx ids. A strict `===` misclassified the coordinator's own node as\n // REMOTE, so the enqueue fan-out dispatched the task body to this very daemon — where\n // it fuzzy-injected into the coordinator's own CLI session (TASKECHO). daemonIdsEquivalent\n // canonicalizes both sides to the machine core before comparing.\n return Boolean(\n (ctx.localMachineId && daemonIdsEquivalent(machineId, ctx.localMachineId))\n || (ctx.localDaemonId && daemonIdsEquivalent(daemonId, ctx.localDaemonId))\n || nodeHasLocalDaemonEvidence(ctx, node)\n );\n}\n\nfunction isConfiguredCoordinatorNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n if (!ctx.localMachineId && !ctx.localDaemonId) return false;\n const nodeId = readString(node.id) || readString((node as any).nodeId) || readString((node as any).node_id);\n if (!nodeId) return false;\n // If the node carries explicit daemon/machine identity that doesn't match the\n // coordinator, it is definitively a remote node — skip the positional fallback.\n // Compare under canonical id form (daemonIdsEquivalent), NOT a raw `!==`: a local\n // coordinator node stored in a different daemon-id form (bare vs `daemon_`/`standalone_`)\n // would otherwise be wrongly excluded here and treated as remote.\n const nodeDaemonId = readNodeDaemonId(node);\n const nodeMachineId = readNodeMachineId(node);\n if (nodeDaemonId && ctx.localDaemonId && !daemonIdsEquivalent(nodeDaemonId, ctx.localDaemonId)) return false;\n if (nodeMachineId && ctx.localMachineId && !daemonIdsEquivalent(nodeMachineId, ctx.localMachineId)) return false;\n const preferredNodeId = readString(ctx.mesh.coordinator?.preferredNodeId)\n || readString((ctx.mesh.coordinator as any)?.preferred_node_id);\n if (preferredNodeId) return nodeId === preferredNodeId;\n const first = ctx.mesh.nodes?.[0] as any;\n const firstNodeId = readString(first?.id) || readString(first?.nodeId) || readString(first?.node_id);\n return !!firstNodeId && nodeId === firstNodeId;\n}\n\nfunction getLocalControlPlaneMatchReason(ctx: MeshContext, node: LocalMeshNodeEntry): string | undefined {\n if (isDirectLocalNode(ctx, node)) return 'matched coordinator daemon or machine id';\n if (isConfiguredCoordinatorNode(ctx, node)) return 'matched configured coordinator node';\n if (node.isLocalWorktree === true) {\n const sourceNode = findClonedFromNode(ctx, node);\n if (sourceNode && isDirectLocalNode(ctx, sourceNode)) return 'matched local cloned-from node';\n if (sourceNode && isConfiguredCoordinatorNode(ctx, sourceNode)) return 'matched configured coordinator source node';\n }\n return undefined;\n}\n\nfunction findClonedFromNode(ctx: MeshContext, node: LocalMeshNodeEntry): LocalMeshNodeEntry | undefined {\n const clonedFromNodeId = readString(node.clonedFromNodeId) || readString((node as any).cloned_from_node_id);\n if (!clonedFromNodeId) return undefined;\n return ctx.mesh.nodes.find(n => meshNodeIdMatches(n, clonedFromNodeId));\n}\n\n/**\n * Resolve the node id a `prefer_worktree` enqueue should target.\n *\n * Worktree clones (mesh_clone_node) are appended to `ctx.mesh.nodes`, so the\n * LAST worktree node in array order is the most recently created one — the one\n * the coordinator most likely just spun up for isolated work. Without an\n * explicit target, an unconstrained queue task is claimed by whichever node\n * polls first (typically the base/main workspace), defeating the isolation\n * intent. Returning a concrete node id lets enqueueTask stamp targetNodeId so\n * the existing node-targeted claim tier routes the task to the worktree.\n *\n * Returns undefined when no worktree node exists (the caller treats this as a\n * no-op and falls back to normal unconstrained queueing).\n */\nexport function resolvePreferredWorktreeNodeId(ctx: MeshContext): string | undefined {\n const worktreeNodes = (ctx.mesh.nodes || []).filter(n => (n as any).isLocalWorktree === true);\n if (worktreeNodes.length === 0) return undefined;\n const chosen = worktreeNodes[worktreeNodes.length - 1] as any;\n return readString(chosen?.id) || readString(chosen?.nodeId) || readString(chosen?.node_id);\n}\n\nexport function isLocalControlPlaneNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n return !!getLocalControlPlaneMatchReason(ctx, node);\n}\n","/**\n * MCP tool schema definitions for the mesh_* tool family.\n *\n * Pure data: per-tool input schemas plus the ALL_MESH_TOOLS registry. Physically\n * split out of mesh-tools.ts (which keeps the handler implementations) — see\n * RF-SURVEY candidate C1. No behavior change: mesh-tools.ts re-exports every symbol\n * below so existing `./tools/mesh-tools.js` import paths stay intact.\n */\n\nexport const MESH_STATUS_TOOL = {\n name: 'mesh_status',\n description: 'Get the current status of all nodes in the repo mesh — health, git state, active sessions, recovery hints, and recommended next steps. Use this to decide which node to send work to or how to recover from failures. Also reports the running daemon build per daemonId under top-level daemonBuilds ({commit, commitShort, version}); when a live daemon was built from a commit BEHIND its workspace HEAD it adds staleDaemonBuilds[] + staleDaemonBuildWarning — meaning a just-merged refinery/mesh-tool fix is NOT yet live on that daemon (awaiting deploy/restart; a local dist rebuild does not update a cloud daemon). Do not repeatedly call this to wait for generating delegated work; wait for pendingCoordinatorEvents/completion events or an explicit user status request.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n _gemini_compat: { type: 'string', description: 'Dummy property for Gemini compatibility. Ignore this.' },\n includeStaleDirectWorkDetails: { type: 'boolean', description: 'Opt in to the full staleDirectWork array. Defaults false; normal status returns compact staleDirectWorkSummary only.' },\n includeSessions: { type: 'boolean', description: 'Opt in to per-node live session arrays. Default false: compact mode returns a per-node sessionSummary (counts) and de-duplicated full session lists under top-level daemonSessions keyed by daemonId (sessions are not repeated for every node that shares a daemon). Set true to also include the full session array on each node.' },\n compact: { type: 'boolean', description: 'Slim payload for LLM callers. Default true. Folds per-node session arrays to sessionSummary and de-duplicates daemon-shared sessions into daemonSessions. Set false (or verbose=true) for the full dashboard-grade payload.' },\n verbose: { type: 'boolean', description: 'Force the full payload; overrides compact.' },\n },\n },\n};\n\nexport const MESH_LIST_NODES_TOOL = {\n name: 'mesh_list_nodes',\n description: 'List all nodes in the mesh with their capabilities, platform, and workspace paths.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n _gemini_compat: { type: 'string', description: 'Dummy property for Gemini compatibility. Ignore this.' },\n },\n },\n};\n\nexport const MESH_ENQUEUE_TASK_TOOL = {\n name: 'mesh_enqueue_task',\n description: 'Add a new task to the mesh work queue. Idle nodes will automatically pull and execute tasks from this queue. Use this instead of mesh_send_task when you do not need to target a specific node.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n message: { type: 'string', description: 'The task instruction for the agent.' },\n task_mode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'Optional task-mode contract. live_debug_readonly rejects obvious write/commit/push/deploy/destructive instructions before dispatch.' },\n taskMode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'CamelCase alias for task_mode.' },\n requiredTags: { type: 'array', items: { type: 'string' }, description: 'Optional capability tags that every eligible node must have, e.g. os=darwin, provider=codex-cli, gpu.' },\n required_tags: { type: 'array', items: { type: 'string' }, description: 'Snake_case alias for requiredTags.' },\n target_node_id: { type: 'string', description: 'Optional HARD constraint: ONLY this node may claim the task. No other node (especially a different machine) will ever claim it — if the target node has no idle session the task stays pending until it does. Use to route a queued task to a specific (e.g. freshly cloned) worktree node instead of letting the first idle base node claim it. Takes priority over prefer_worktree. An unresolvable target id is rejected at enqueue (no silent unpin).' },\n targetNodeId: { type: 'string', description: 'CamelCase alias for target_node_id.' },\n target_node: { type: 'string', description: 'Alias for target_node_id.' },\n targetNode: { type: 'string', description: 'CamelCase alias for target_node_id.' },\n prefer_worktree: { type: 'boolean', description: 'Optional: when true, route this task to the most recently cloned idle worktree node (avoids the main/base workspace preemptively claiming an isolated task). No-op if no worktree node exists; resolves to a target_node_id when one does.' },\n preferWorktree: { type: 'boolean', description: 'CamelCase alias for prefer_worktree.' },\n depends_on: { type: 'array', items: { type: 'string' }, description: 'Task ids that must complete before this task becomes claimable. Cycles are rejected at enqueue.' },\n dependsOn: { type: 'array', items: { type: 'string' }, description: 'CamelCase alias for depends_on.' },\n mission_id: { type: 'string', description: 'Mission this task belongs to (mesh_mission record id).' },\n missionId: { type: 'string', description: 'CamelCase alias for mission_id.' },\n },\n required: ['message'],\n },\n};\n\nexport const MESH_VIEW_QUEUE_TOOL = {\n name: 'mesh_view_queue',\n description: 'View the mesh work queue with source-of-truth active counts separated from historical completed/failed/cancelled records. Do not repeatedly call this to wait for generating assigned work; wait for pendingCoordinatorEvents/completion events or an explicit user status request.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n status: {\n type: 'array',\n items: { type: 'string' },\n description: 'Explicit row filter by task status: pending, assigned, completed, failed, cancelled. Source-of-truth counts remain unfiltered; visible* counts describe returned rows.',\n },\n view: {\n type: 'string',\n enum: ['all', 'active', 'historical'],\n description: 'Optional row view. active returns pending/assigned rows, historical returns completed/failed/cancelled rows, all returns every persisted queue row. Defaults to all for compatibility.',\n },\n compact: { type: 'boolean', description: 'Slim payload for LLM callers. Default true. Drops large historical (completed/failed/cancelled) queue row arrays, the full staleDirectWork orphan array (kept as staleDirectWorkSummary counts), and per-row maintenance cleanupCandidates in favor of counts; pending/assigned active rows are retained. Set false (or verbose=true) for the full dashboard-grade payload.' },\n verbose: { type: 'boolean', description: 'Force the full payload; overrides compact.' },\n },\n },\n};\n\nexport const MESH_QUEUE_CANCEL_TOOL = {\n name: 'mesh_queue_cancel',\n description: 'Cancel a pending/assigned/completed/failed mesh queue task without deleting audit history. Use this to retire stale queue items that target dead sessions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n task_id: { type: 'string', description: 'Queue task ID to cancel.' },\n reason: { type: 'string', description: 'Optional operator-visible reason for cancellation.' },\n },\n required: ['task_id'],\n },\n};\n\nexport const MESH_QUEUE_REQUEUE_TOOL = {\n name: 'mesh_queue_requeue',\n description: 'Return a mesh queue task to pending for retry. By default clears stale assigned owner and target session so another live session can claim it. When the task has exceeded its retry cap it is auto-failed instead; use force=true to override.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n task_id: { type: 'string', description: 'Queue task ID to requeue.' },\n reason: { type: 'string', description: 'Optional operator-visible reason for requeueing.' },\n target_node_id: { type: 'string', description: 'Optional replacement target node ID.' },\n target_session_id: { type: 'string', description: 'Optional replacement target runtime session ID.' },\n clear_target_node: { type: 'boolean', description: 'When true, remove any existing target node constraint.' },\n keep_target_session: { type: 'boolean', description: 'When true, preserve an existing target session if target_session_id is not provided. Defaults false to avoid stale session targets.' },\n force: { type: 'boolean', description: 'When true, bypass the retry cap and requeue even if maxRetries has been exceeded. Use only for explicit operator recovery.' },\n },\n required: ['task_id'],\n },\n};\n\nexport const MESH_SEND_TASK_TOOL = {\n name: 'mesh_send_task',\n description: 'Legacy push-based task assignment. Enqueues a task specifically targeted at a given node. The node will pull it immediately if idle.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID (from mesh_list_nodes).' },\n session_id: { type: 'string', description: 'Agent session ID on the target node.' },\n message: { type: 'string', description: 'Natural-language task to send to the agent.' },\n task_mode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'Optional task-mode contract. live_debug_readonly rejects obvious write/commit/push/deploy/destructive instructions before local or remote direct dispatch.' },\n taskMode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'CamelCase alias for task_mode.' },\n mission_id: { type: 'string', description: 'Mission this task belongs to (mesh_mission record id). When set, the directly dispatched task is attributed to the mission task aggregates exactly like mesh_enqueue_task, including terminal completion. Omit for an unattributed direct dispatch.' },\n missionId: { type: 'string', description: 'CamelCase alias for mission_id.' },\n },\n required: ['node_id', 'session_id', 'message'],\n },\n};\n\nexport const MESH_READ_CHAT_TOOL = {\n name: 'mesh_read_chat',\n description: 'Read recent chat messages from a delegated agent session on a mesh node. Use compact=true for coordinator context-efficient review: it filters tool/internal/debug chatter and returns the final user-visible summary plus recent key messages. If the runtime session has completed, provider_session_id can explicitly target provider transcript history.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n session_id: { type: 'string', description: 'Agent session ID to read from.' },\n provider_session_id: { type: 'string', description: 'Optional provider transcript/session ID for completed sessions.' },\n tail: { type: 'number', description: 'Number of recent messages to return (default: 10).' },\n compact: { type: 'boolean', description: 'When true, return a compact coordinator summary instead of the full transcript: tool/internal/control/debug messages are excluded and only recent user-visible key messages plus the final assistant summary are included.' },\n },\n required: ['node_id', 'session_id'],\n },\n};\n\nexport const MESH_READ_DEBUG_TOOL = {\n name: 'mesh_read_debug',\n description: 'Collect a daemon-side chat/parser debug bundle for a delegated agent session on a mesh node without opening the browser UI. Defaults to daemon_file delivery and returns a saved bundle locator.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n session_id: { type: 'string', description: 'Agent session ID to debug.' },\n provider_session_id: { type: 'string', description: 'Optional provider transcript/session ID for completed session history.' },\n tail: { type: 'number', description: 'Number of recent read_chat messages to embed (default: 40).' },\n delivery: { type: 'string', enum: ['daemon_file', 'inline'], description: 'daemon_file saves the full sanitized bundle on the daemon; inline returns it directly. Default: daemon_file.' },\n },\n required: ['node_id', 'session_id'],\n },\n};\n\nexport const MESH_LAUNCH_SESSION_TOOL = {\n name: 'mesh_launch_session',\n description: 'Launch a new agent session on a mesh node. Returns the session ID for subsequent send_task/read_chat calls. If the user names a provider, preserve it exactly: Hermes = hermes-cli, Claude Code/Claude = claude-cli, Codex = codex-cli, Gemini = gemini-cli. If type is omitted, resolve strictly from the node policy providerPriority and provider detection; fail closed when no configured provider is usable. Do not default to claude-cli.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n type: { type: 'string', description: 'Optional provider type to launch. Use hermes-cli for Hermes, claude-cli for Claude Code, codex-cli for Codex, gemini-cli for Gemini. When omitted, node.policy.providerPriority is probed in order.' },\n force: { type: 'boolean', description: 'Set true to launch an ADDITIONAL session even when this node already has a live mesh-owned worker session. Default false: if a live worker session for this mesh+node already exists (e.g. an enqueue auto-launch just spawned one), the existing session is returned idempotently instead of creating an empty duplicate. Only pass force when you intentionally want a second concurrent provider/session on the node.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_GIT_STATUS_TOOL = {\n name: 'mesh_git_status',\n description: 'Get git status for a mesh node workspace — branch, dirty state, changed files.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_READ_NODE_LOGS_TOOL = {\n name: 'mesh_read_node_logs',\n description: 'Fetch a recent daemon LOG tail directly from a (possibly remote) mesh node over P2P — no session launch, no PowerShell/shell grep on the remote machine. '\n + 'Use this to debug a node\\'s daemon: read its error/warn lines, grep for a pattern, or read since a timestamp. '\n + 'The reply is byte-bounded (≤128KB, default 64KB; truncated:true when the file was larger, newest lines kept) and secrets (API keys, machine secrets, bearer tokens, JWTs, TURN credentials) are redacted before transmission. '\n + 'This reads the DAEMON log, not an agent session transcript — for a session transcript use mesh_read_chat / mesh_read_debug.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID (the daemon owning it serves its own log).' },\n grep: { type: 'string', description: 'Optional regex (case-insensitive) — only matching log lines are returned. Invalid regex falls back to a literal substring match.' },\n since_ms: { type: 'number', description: 'Optional epoch-ms floor — only log lines at/after this time are returned (lines without a parseable timestamp are kept).' },\n tail_bytes: { type: 'number', description: 'Max bytes of log tail to read (default 65536, capped at 131072). Larger files are truncated to the newest tail_bytes.' },\n date: { type: 'string', description: 'Optional YYYY-MM-DD log date (defaults to today). Falls back to the size-rotation backup when the active file is absent.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_FAST_FORWARD_NODE_TOOL = {\n name: 'mesh_fast_forward_node',\n description: 'Safely dry-run or execute an obvious direct fast-forward for a mesh node without launching an agent session. '\n + 'mode=\"merge\" (default) absorbs upstream commits into the local branch via git merge --ff-only (ahead=0, behind>0). '\n + 'mode=\"push\" publishes local commits to origin via a strict ff-only push (HEAD must be a descendant of origin/<branch>). '\n + 'Defaults to dry-run; execution requires execute=true. Never force-pushes, rebases, resets, cleans, or checks out arbitrary revisions. '\n + 'When the merge path finds the branch ahead with nothing to merge, it returns code \"ahead_needs_push\" pointing at mode=\"push\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n mode: { type: 'string', enum: ['merge', 'push'], description: 'merge (default): git merge --ff-only to absorb upstream. push: strict ff-only push of local commits to origin/<branch>; refuses any non-fast-forward.' },\n branch: { type: 'string', description: 'Optional guard: require the node\\'s current branch to match this branch before planning/executing.' },\n execute: { type: 'boolean', description: 'When true, apply the fast-forward/push if all safety gates pass. Defaults false/dry-run.' },\n dry_run: { type: 'boolean', description: 'Preview only. Defaults true unless execute=true; dry_run=true overrides execute.' },\n update_submodules: { type: 'boolean', description: 'mode=\"merge\" only: when true, if the root fast-forward changes gitlinks, run only git submodule update --init --recursive and verify submodules clean.' },\n push_submodules: { type: 'boolean', description: 'mode=\"push\" only: also ff-only push submodule HEADs to their origin main. Gated by mesh policy allowAutoPublishSubmoduleMainCommits — skipped unless that policy is enabled. Defaults false (root push only).' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_RESTART_DAEMON_TOOL = {\n name: 'mesh_restart_daemon',\n description: 'Update a mesh node\\'s daemon to the latest published version on its release channel and restart it — the same path as the dashboard \"preview update\" button, exposed as a mesh command so a coordinator can roll a worker daemon onto a freshly deployed version without a manual restart round-trip. No agent session is launched. '\n + 'Idle-gated: a node whose daemon has an active session (generating / waiting_approval / starting) is refused with code \"blocking_sessions\" so an in-flight turn is never interrupted. '\n + 'If the node is already on the latest version it is a no-op (no restart), matching the dashboard button (returns alreadyLatest:true). '\n + 'Targets a single node — call other (idle) nodes first; restarting the coordinator\\'s OWN daemon is naturally refused while its calling turn is active. '\n + 'Passing channel switches the daemon\\'s release channel (and server URL) before restarting; omit it to keep the daemon on its configured channel.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID — the daemon that owns this node is updated and restarted.' },\n channel: { type: 'string', enum: ['stable', 'preview'], description: 'Optional release channel to update from. Defaults to the daemon\\'s configured updateChannel. Setting it also repoints the daemon\\'s server URL to that channel.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_CHECKPOINT_TOOL = {\n name: 'mesh_checkpoint',\n description: 'Create a git checkpoint (commit) on a mesh node workspace.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n message: { type: 'string', description: 'Checkpoint commit message.' },\n },\n required: ['node_id', 'message'],\n },\n};\n\nexport const MESH_MISSION_UPSERT_TOOL = {\n name: 'mesh_mission_upsert',\n description: 'Create or update a persistent mission record so the plan survives coordinator restarts. Create a mission before enqueueing a multi-task batch, attach tasks via mesh_enqueue_task mission_id, and update status to completed/abandoned when the outcome is decided. Progress is derived from task statuses — there is no separate progress field.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n mission_id: { type: 'string', description: 'Mission id to update. Omit to create a new mission.' },\n title: { type: 'string', description: 'Short mission title.' },\n goal: { type: 'string', description: 'Free-text mission goal/definition of done.' },\n status: { type: 'string', enum: ['active', 'paused', 'completed', 'abandoned'], description: 'Mission lifecycle status. Defaults to active on create.' },\n },\n required: ['title'],\n },\n};\n\nexport const MESH_MISSION_LIST_TOOL = {\n name: 'mesh_mission_list',\n description: 'List missions with their goal, status, and live task progress (total/pending/assigned/completed/failed). '\n + 'Unlike mesh_status (which surfaces live + recent missions), this returns every mission regardless of status by default, '\n + 'so paused/abandoned/completed missions are never hidden. Filter with `status` to scope (e.g. [\"paused\"] to find paused missions). '\n + 'Compact (default) elides the full goal to a capped preview; pass verbose=true for full goal text. Read-only.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n status: {\n type: 'array',\n items: { type: 'string', enum: ['active', 'paused', 'completed', 'abandoned'] },\n description: 'Optional status filter. Omit to return missions of every status.',\n },\n verbose: { type: 'boolean', description: 'Return full goal text instead of a capped preview. Defaults to false (compact).' },\n },\n },\n};\n\nexport const MESH_APPROVE_TOOL = {\n name: 'mesh_approve',\n description: 'Approve or reject a pending action on a delegated agent session.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n session_id: { type: 'string', description: 'Agent session ID with pending approval.' },\n action: { type: 'string', enum: ['approve', 'reject'], description: 'Action to take.' },\n },\n required: ['node_id', 'session_id', 'action'],\n },\n};\n\nexport const MESH_CLONE_NODE_TOOL = {\n name: 'mesh_clone_node',\n description: 'Create a new worktree-based node from an existing node for isolated parallel work. '\n + 'Creates a git worktree on a new branch so multiple tasks can run on separate branches simultaneously.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n source_node_id: { type: 'string', description: 'Node ID to clone from (from mesh_list_nodes).' },\n branch: { type: 'string', description: 'Branch name for the new worktree (e.g. \"feat/auth-refactor\").' },\n base_branch: { type: 'string', description: 'Starting point for the branch (default: current HEAD).' },\n },\n required: ['source_node_id', 'branch'],\n },\n};\n\nexport const MESH_REMOVE_NODE_TOOL = {\n name: 'mesh_remove_node',\n description: 'Remove a node from the mesh. If the node is a worktree, also cleans up the git worktree and directory. Session cleanup is controlled by mesh policy sessionCleanupOnNodeRemove unless session_cleanup_mode overrides it for this call. The coordinator\\'s own local base node (same machine, NOT a worktree) is protected — removing it breaks live mesh membership and is rejected unless force:true is passed.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID to remove.' },\n session_cleanup_mode: {\n type: 'string',\n enum: ['preserve', 'stop', 'delete_stopped', 'stop_and_delete'],\n description: 'Optional override for cleanup of delegated sessions attached to this node. preserve keeps history/processes; stop stops live runtimes only; delete_stopped removes completed transcripts only; stop_and_delete stops live runtimes and deletes records.',\n },\n force: { type: 'boolean', description: 'Override the coordinator-base-node guard. Only set true to intentionally tear down this mesh; the coordinator must then be re-registered/restarted. Worktree nodes never need force.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_CLEANUP_SESSIONS_TOOL = {\n name: 'mesh_cleanup_sessions',\n description: 'Manually clean up delegated session records for a mesh node without removing the node. Defaults should preserve reviewable history unless the caller chooses a mode explicitly.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID whose delegated sessions should be considered for cleanup.' },\n mode: {\n type: 'string',\n enum: ['preserve', 'stop', 'delete_stopped', 'stop_and_delete'],\n description: 'preserve = no-op; stop = release process occupancy by stopping live runtimes; delete_stopped = remove completed/stopped records while leaving live runtimes alone; stop_and_delete = stop live runtimes and delete records.',\n },\n session_ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional explicit session IDs to limit cleanup to. When omitted, sessions are matched by node/workspace metadata.',\n },\n dry_run: { type: 'boolean', description: 'Preview matched/stopped/deleted/skipped session IDs without mutating session-host state.' },\n },\n required: ['node_id', 'mode'],\n },\n};\n\nexport const MESH_TASK_HISTORY_TOOL = {\n name: 'mesh_task_history',\n description: 'Read the task ledger for this mesh — dispatched tasks, completions, failures, checkpoints, and node lifecycle events. Use to understand what has been done before deciding next steps, to detect repeated failures, and to inform recovery decisions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n tail: { type: 'number', description: 'Number of recent entries to return (default: 20; clamped to 40 in compact mode, 200 in verbose).' },\n kind: { type: 'string', description: 'Filter by entry kind: task_dispatched, task_completed, task_failed, task_stalled, session_launched, checkpoint_created, node_cloned, node_removed, direct_fast_forward.' },\n compact: { type: 'boolean', description: 'Slim payload for LLM callers. Default true. Truncates long payload strings (message/taskSummary ≤200, finalSummary ≤300) and elides any large nested evidence blob (>2KB serialized — e.g. validationSummary/result/patchEquivalence/submoduleReachability) to a {_elided,_kind,_bytes,_hint} placeholder; full evidence stays accessible via mesh_reconcile_ledger. Set false (or verbose=true) for full untruncated payloads.' },\n verbose: { type: 'boolean', description: 'Force the full untruncated payload; overrides compact.' },\n },\n },\n};\n\nexport const MESH_RECORD_NOTE_TOOL = {\n name: 'mesh_record_note',\n description: 'Record a durable operating note for this mesh — a runtime-accumulated lesson that future coordinators inherit. '\n + 'Unlike Claude-only memory/CLAUDE.md, this is provider-neutral: it persists in the mesh ledger and is injected into every coordinator\\'s system prompt at launch (codex, hermes, antigravity, claude alike). '\n + 'Use it when you learn something durable: a provider quirk, a pattern to avoid, or a recovery lesson. Keep each note to one concrete, reusable fact. Not for transient task status — use missions/checkpoints for that.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n text: { type: 'string', description: 'The note — one concrete, reusable operating fact/lesson. Phrase it so a future coordinator can act on it without this conversation\\'s context.' },\n category: {\n type: 'string',\n enum: ['provider_quirk', 'pattern_to_avoid', 'recovery_lesson'],\n description: 'Optional classification: provider_quirk (a provider/runtime behaves unexpectedly), pattern_to_avoid (an approach that caused problems), recovery_lesson (how a failure was recovered).',\n },\n },\n required: ['text'],\n },\n};\n\nexport const MESH_RECONCILE_LEDGER_TOOL = {\n name: 'mesh_reconcile_ledger',\n description: 'Reconcile daemon-local mesh ledgers by querying bounded ledger slices over P2P/DataChannel and importing missing entries into the coordinator local JSONL ledger. Cloud/D1 is not used as a ledger source of truth.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_ids: { type: 'array', items: { type: 'string' }, description: 'Optional node IDs to query. Defaults to all mesh nodes.' },\n limit: { type: 'number', description: 'Bounded slice size per node. Defaults to 100 and is clamped by daemon-core.' },\n after_id: { type: 'string', description: 'Optional cursor entry ID; remote slices return entries strictly after this ID when present.' },\n since: { type: 'string', description: 'Optional ISO timestamp lower bound for queried entries.' },\n import_entries: { type: 'boolean', description: 'When false, query and report evidence without importing remote entries. Defaults true.' },\n },\n },\n};\n\nexport const MESH_PRUNE_STALE_DIRECT_TOOL = {\n name: 'mesh_prune_stale_direct',\n description: 'Prune orphaned staleDirect dispatch records — direct task dispatches whose original node/session is no longer present in the live mesh. dry_run (default) reports exactly which records would be pruned without mutating anything; pass execute=true to delete them. Active/pending/assigned/generating work and fresh unacknowledged dispatch failures (node/session still live) are always preserved. The append-only mesh ledger audit history is left intact.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n execute: { type: 'boolean', description: 'When true, actually delete the orphaned records. Defaults false (dry run). Ignored when dry_run=true.' },\n dry_run: { type: 'boolean', description: 'Force a preview without mutation even if execute=true. Defaults to dry-run behavior when execute is not set.' },\n include_terminal: { type: 'boolean', description: 'Also prune terminal (completed/failed) direct dispatch store rows in addition to orphans. Defaults false.' },\n },\n },\n};\n\nexport const MESH_REFINE_NODE_TOOL = {\n name: 'mesh_refine_node',\n description: 'The Refinery: validate → merge → push → clean up a completed worktree node onto the base branch. '\n + 'Defaults to dry-run (plan only): returns the validation plan with mergeWillRun:false/cleanupWillRun:false and performs NO merge/push/cleanup. '\n + 'Pass execute=true to actually converge the node. execute=true is async: the immediate response includes async:true, status:\\'accepted\\', jobId, interactionId, target node, and startedAt; completion/failure evidence is delivered through pending mesh events and the mesh task ledger. '\n + 'dry_run=true overrides execute. Matches the mesh_refine_batch / mesh_fast_forward_node dry_run/execute contract.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID of the completed worktree node to refine and merge.' },\n execute: { type: 'boolean', description: 'When true, run validation/merge/push/cleanup for this node. Defaults false/dry-run.' },\n dry_run: { type: 'boolean', description: 'Preview the validation plan without merging. Defaults true unless execute=true; dry_run=true overrides execute.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_REFINE_BATCH_TOOL = {\n name: 'mesh_refine_batch',\n description: 'Batch Refinery: converge multiple sibling worktree nodes onto the base branch in one conflict-aware sequential pipeline. '\n + 'Orders nodes by change-area (non-submodule nodes first, submodule-touching nodes serialized last) so each merged sibling advances the base and the next node auto-rebases + re-checks patch-equivalence before its own merge. '\n + 'Each node runs the same validation/patch-equivalence/submodule-reachability/merge/cleanup gates as mesh_refine_node. '\n + 'Conflicting or blocked nodes are isolated as blocked_review while the rest of the batch proceeds. Defaults to dry-run (plan only); set execute=true to converge. Never force-pushes or resets. '\n + 'execute=true is async: the immediate response is async:true / status:\\'accepted\\' with the batch jobId and ordered target node list; per-node convergence runs in the background and the aggregate completion/failure (with per-node merged / blocked_review / not_mergeable results) is delivered as a terminal refine event via pending mesh events and the ledger — do not re-invoke while a batch is in flight. dry_run returns the plan synchronously.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional explicit node IDs to converge, in any order (the tool computes the safe merge order). When omitted, all local worktree nodes that need convergence are auto-collected.',\n },\n execute: { type: 'boolean', description: 'When true, run validation/rebase/merge for each node in order. Defaults false/dry-run.' },\n dry_run: { type: 'boolean', description: 'Preview the ordering + per-node validation plan without executing. Defaults true unless execute=true; dry_run=true overrides execute.' },\n },\n required: [],\n },\n};\n\nexport const MESH_REFINE_CONFIG_SCHEMA_TOOL = {\n name: 'mesh_refine_config_schema',\n description: 'Return the Repo Mesh Refinery config JSON schema and supported repo-local config locations. This is the validation source of truth; heuristic command detection is suggestions-only.',\n inputSchema: { type: 'object' as const, properties: {} },\n};\n\nexport const MESH_VALIDATE_REFINE_CONFIG_TOOL = {\n name: 'mesh_validate_refine_config',\n description: 'Validate the repo mesh/refine config for a node/workspace without running validation commands or merging.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace whose refine config should be loaded. Defaults to the first mesh node.' },\n config: { type: 'object', description: 'Optional inline config object to validate instead of loading from the repo.' },\n },\n },\n};\n\nexport const MESH_SUGGEST_REFINE_CONFIG_TOOL = {\n name: 'mesh_suggest_refine_config',\n description: 'Suggest a repo mesh/refine config scaffold from project context/package scripts. Suggestions are never executed until saved as explicit refine config.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace used for suggestions. Defaults to the first mesh node.' },\n },\n },\n};\n\nexport const MESH_CHANGE_IMPACT_CONFIG_SCHEMA_TOOL = {\n name: 'mesh_change_impact_config_schema',\n description: 'Return the Change Impact config JSON schema and supported repo-local config locations. Change Impact config declaratively classifies which package/file changes between the live daemon build and workspace HEAD require a daemon rebuild/restart vs. a web-only redeploy vs. nothing. Declarative only — config is parsed, never executed.',\n inputSchema: { type: 'object' as const, properties: {} },\n};\n\nexport const MESH_VALIDATE_CHANGE_IMPACT_CONFIG_TOOL = {\n name: 'mesh_validate_change_impact_config',\n description: 'Validate a Change Impact config for a node/workspace and report valid/errors. Loads .adhdev/change-impact.{json,yaml,yml} (or repo-mesh-change-impact.* alias) from the repo unless an inline config is provided.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace whose change-impact config should be loaded. Defaults to the first mesh node.' },\n config: { type: 'object', description: 'Optional inline config object to validate instead of loading from the repo.' },\n },\n },\n};\n\nexport const MESH_SUGGEST_CHANGE_IMPACT_CONFIG_TOOL = {\n name: 'mesh_suggest_change_impact_config',\n description: 'Suggest a Change Impact config scaffold from the repo package layout (web-* → web-only, others → daemon-runtime, plus docs/license markers as non-runtime). Heuristic scaffold only — the draft must be reviewed and saved before it takes effect; nothing is executed.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace used for suggestions. Defaults to the first mesh node.' },\n },\n },\n};\n\nexport const MESH_INIT_TOOL = {\n name: 'mesh_init',\n description: 'One-click mesh onboarding for an existing git project. Detects installed CLI providers, suggests Refinery (.adhdev/refine.json) and worktree bootstrap (.adhdev/worktree_bootstrap.json) configs, optionally writes them to disk, and recommends a node providerPriority from the detected providers. Suggestions are scaffold only and never execute until saved; providerPriority is a recommendation to apply to node policy, not auto-applied. Defaults to dry-run (no files written) and never overwrites an existing config unless overwrite=true.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace to onboard. Defaults to the first mesh node with a workspace.' },\n write: { type: 'boolean', description: 'When true, persist the suggested configs to disk. Defaults false (dry-run preview only).' },\n overwrite: { type: 'boolean', description: 'When true, overwrite an existing config file. Defaults false (never clobber an existing refine/bootstrap config).' },\n },\n },\n};\n\nexport const MESH_REFINE_PLAN_TOOL = {\n name: 'mesh_refine_plan',\n description: 'Dry-run Refinery plan for a worktree node: reports config source, validation commands, suggestions/unavailable reason, and merge/cleanup intent without executing validation or git merge.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID of the worktree node to plan.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_REVIEW_INBOX_TOOL = {\n name: 'mesh_review_inbox',\n description: 'List local worktree nodes that need human review: merge candidates (pushed feature branches ready to merge) and Refinery-blocked review results. Returns evidence summaries, diff stats vs. the default branch, and suggested actions (Refine / Requeue / Dismiss). Remote nodes are excluded in M4.0.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n mesh_id: { type: 'string', description: 'Mesh ID (optional — inferred from active mesh if omitted).' },\n },\n required: [],\n },\n};\n\nexport const ALL_MESH_TOOLS = [\n MESH_STATUS_TOOL,\n MESH_LIST_NODES_TOOL,\n MESH_ENQUEUE_TASK_TOOL,\n MESH_VIEW_QUEUE_TOOL,\n MESH_QUEUE_CANCEL_TOOL,\n MESH_QUEUE_REQUEUE_TOOL,\n MESH_SEND_TASK_TOOL,\n MESH_READ_CHAT_TOOL,\n MESH_READ_DEBUG_TOOL,\n MESH_LAUNCH_SESSION_TOOL,\n MESH_GIT_STATUS_TOOL,\n MESH_READ_NODE_LOGS_TOOL,\n MESH_FAST_FORWARD_NODE_TOOL,\n MESH_RESTART_DAEMON_TOOL,\n MESH_CHECKPOINT_TOOL,\n MESH_APPROVE_TOOL,\n MESH_CLONE_NODE_TOOL,\n MESH_REMOVE_NODE_TOOL,\n MESH_REFINE_NODE_TOOL,\n MESH_REFINE_BATCH_TOOL,\n MESH_REFINE_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_REFINE_CONFIG_TOOL,\n MESH_SUGGEST_REFINE_CONFIG_TOOL,\n MESH_CHANGE_IMPACT_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_SUGGEST_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_INIT_TOOL,\n MESH_REFINE_PLAN_TOOL,\n MESH_CLEANUP_SESSIONS_TOOL,\n MESH_PRUNE_STALE_DIRECT_TOOL,\n MESH_TASK_HISTORY_TOOL,\n MESH_RECORD_NOTE_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n MESH_MISSION_UPSERT_TOOL,\n MESH_MISSION_LIST_TOOL,\n MESH_REVIEW_INBOX_TOOL,\n];\n","/**\n * mesh_status compact-mode per-node fold helpers.\n *\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change. Slims the LLM-facing node copy: compact git snapshot, the canonical\n * preserved-marker list, the full per-node compaction (compactMeshStatusNode), the\n * quiet-node minimal stub (minimalCompactNode), node severity / noteworthiness\n * ranking, and the per-node session summary. Imports only the shared large-value\n * elider; the mesh_status node-array byte-budget bounding stays in mesh-tools.ts and\n * imports these back, so there is no runtime import cycle.\n */\nimport { elideLargeNestedValue } from './mesh-tool-shared.js';\n\n// Compact-mode git snapshot for LLM callers: keep the coordinator-relevant scalar\n// signals (branch/upstream/ahead/behind/dirty/headCommit) and the submodules array\n// (its out-of-sync state drives convergence decisions) while dropping the large\n// duplicated blobs (full changed-file lists, diffs, raw porcelain) that the full\n// dashboard payload carries. The full status object remains available via verbose.\nfunction buildCompactGitSnapshot(status: any): Record<string, unknown> | undefined {\n if (!status || typeof status !== 'object' || Array.isArray(status)) return undefined;\n const slim: Record<string, unknown> = {};\n const carry = [\n 'isGitRepo',\n 'branch',\n 'headCommit',\n 'upstream',\n 'upstreamStatus',\n 'ahead',\n 'behind',\n 'dirty',\n 'detached',\n 'submodules',\n ];\n for (const key of carry) {\n if (status[key] !== undefined) slim[key] = status[key];\n }\n return slim;\n}\n\n// Compact-mode submodules fold: the full submodules array (path/commit/status/\n// branch per submodule) is repeated on every node that shares a superproject, so\n// it grows O(nodes × submodules). In compact mode we keep the actionable signal\n// (count + the out-of-sync paths, which drive convergence decisions) and drop the\n// per-submodule commit/status blobs. The full array stays in verbose. Out-of-sync\n// paths are also surfaced separately on the node as `outOfSyncSubmodules`.\nfunction summarizeCompactSubmodules(submodules: any): Record<string, unknown> | undefined {\n if (!Array.isArray(submodules) || submodules.length === 0) return undefined;\n const outOfSync = submodules.filter((s: any) => s?.outOfSync).map((s: any) => s?.path).filter(Boolean);\n return {\n count: submodules.length,\n ...(outOfSync.length > 0 ? { outOfSyncPaths: outOfSync } : {}),\n };\n}\n\n// Canonical set of small per-node MARKER fields that MUST survive compact folding\n// intact on every node — quiet stub or detailed. Both fold paths reference this one\n// list: (a) the generic elide backstop skips these so they aren't truncated, and\n// (b) the minimal-stub reconstruction (minimalCompactNode) re-attaches them. Keeping\n// it single-sourced is the fix for the class of bug the rc.371 dataFreshness\n// regression exposed — a canonical node marker that survived the elide skip-list but\n// was silently dropped by the allowlist-based minimal stub, so it read null on\n// exactly the quiet nodes a coordinator most needs the marker for. Add a new marker\n// field HERE once and both fold paths preserve it; never hand-list it in two places.\nconst MESH_COMPACT_PRESERVED_MARKER_FIELDS = ['dataFreshness'] as const;\n\n// Compact-mode per-node fold for mesh_status. The dashboard/verbose payload\n// (`results`) is untouched; this only slims the LLM-facing node copy. It folds\n// the repetitive heavy fields that scale O(nodes):\n// - git: slim scalar snapshot + summarized submodules (no full file lists/blobs)\n// - machine: drop the verbose identityEvidence[] array and the long\n// localityReason string (which interpolates every evidence token) — keep the\n// resolved scalars (displayName/daemonId/machineId/hostname/sameMachine/locality)\n// - staleDaemonBuild: the full ~300-char warning + duplicated build fields are\n// already aggregated ONCE at the top level under staleDaemonBuilds[] +\n// staleDaemonBuildWarning. On the node, collapse to a short boolean-ish flag so\n// the per-node copy isn't N× the same warning text.\n// - branchConvergence: keep the decision fields (status/needsConvergence/reason/\n// branch/ahead/behind); drop the long per-node nextStep prose (it is echoed in\n// nextStepHints and branchConvergenceSummary).\n// Any remaining oversized nested blob is elided by the generic byte guard.\nexport function compactMeshStatusNode(entry: any): any {\n if (!entry || typeof entry !== 'object') return entry;\n const next: any = { ...entry };\n\n if (next.git !== undefined) {\n const slimGit = buildCompactGitSnapshot(next.git);\n if (slimGit) {\n if (slimGit.submodules !== undefined) {\n const subSummary = summarizeCompactSubmodules(slimGit.submodules);\n if (subSummary) slimGit.submodules = subSummary;\n else delete slimGit.submodules;\n }\n next.git = slimGit;\n }\n }\n\n if (next.machine && typeof next.machine === 'object') {\n const m = next.machine as Record<string, unknown>;\n next.machine = {\n daemonId: m.daemonId,\n machineId: m.machineId,\n hostname: m.hostname,\n displayName: m.displayName,\n sameMachine: m.sameMachine,\n locality: m.locality,\n };\n }\n\n // submoduleWarning is a fixed ~120-char prose string repeated on every node\n // with an out-of-sync submodule. The actionable signal (which submodules) is\n // already on `outOfSyncSubmodules`; collapse the prose to a boolean flag in\n // compact mode.\n if (typeof next.submoduleWarning === 'string') {\n next.submodulesOutOfSync = true;\n delete next.submoduleWarning;\n }\n\n if (next.staleDaemonBuild && typeof next.staleDaemonBuild === 'object') {\n const b = next.staleDaemonBuild as Record<string, unknown>;\n // Replace the full per-node object (warning prose + build fields, all of\n // which are aggregated top-level) with a terse flag. The daemonId lets the\n // coordinator cross-reference the top-level staleDaemonBuilds[] entry.\n next.staleDaemonBuild = {\n scope: b.scope,\n isDaemonAffecting: b.isDaemonAffecting !== false,\n seeStaleDaemonBuilds: true,\n };\n }\n\n // branchConvergence is kept intact for detailed compact nodes (it carries the\n // actionable per-node nextStep). It is small per-node and bounded by the\n // detail byte-budget; the larger repetition lives in branchConvergenceSummary,\n // which is capped separately. Quiet nodes drop nextStep via minimalCompactNode.\n\n // capabilityTagsByProvider repeats the os=/arch=/converge= base set once per\n // provider — heavy and O(nodes × providers). The representative capabilityTags\n // (kept) already conveys what a node can match; the per-provider breakdown is a\n // verbose/dashboard concern. Drop it from the compact LLM-facing copy.\n delete next.capabilityTagsByProvider;\n\n // Generic backstop: elide any other oversized nested blob on the node. The\n // structural blobs slimmed above plus the canonical preserved markers are skipped\n // so the byte guard never truncates them.\n const elideSkip = new Set<string>(['git', 'machine', 'branchConvergence', 'staleDaemonBuild', 'sessions', ...MESH_COMPACT_PRESERVED_MARKER_FIELDS]);\n for (const k of Object.keys(next)) {\n if (elideSkip.has(k)) continue;\n next[k] = elideLargeNestedValue(k, next[k]);\n }\n\n return next;\n}\n\n// Rough severity ranking so that when the byte budget forces a downgrade, the most\n// urgent nodes (errors/degraded/blocked launches) are the ones kept in detail.\nexport function compactNodeSeverity(entry: any): number {\n if (!entry || typeof entry !== 'object') return 0;\n if (entry.error || (entry.health && entry.health !== 'online' && entry.health !== 'dirty')) return 5;\n if (entry.launchReady === false) return 4;\n if (entry.isDirty === true || entry.health === 'dirty') return 3;\n if (entry.branchConvergence?.needsConvergence === true) return 2;\n if (entry.staleDaemonBuild || entry.submodulesOutOfSync || entry.recoveryHints) return 1;\n return 0;\n}\n\nexport function isNoteworthyCompactNode(entry: any): boolean {\n if (!entry || typeof entry !== 'object') return true;\n if (entry.health && entry.health !== 'online') return true;\n if (entry.isDirty === true) return true;\n if (entry.error) return true;\n if (entry.launchReady === false) return true;\n if (entry.staleDaemonBuild) return true;\n if (entry.submoduleWarning || entry.submodulesOutOfSync) return true;\n if (entry.recoveryHints) return true;\n if (Array.isArray(entry.nextStepHints) && entry.nextStepHints.length > 0) return true;\n if (entry.branchConvergence?.needsConvergence === true) return true;\n const sessionCount = Array.isArray(entry.sessions)\n ? entry.sessions.length\n : (entry.sessionSummary?.total ?? 0);\n if (sessionCount > 0) return true;\n return false;\n}\n\n// Minimal per-node stub for quiet nodes / byte-budget overflow. Keeps the fields a\n// coordinator needs to find and reason about a node (id/workspace/health/branch/\n// launchReady) plus the branchConvergence decision scalars, marked `folded` so\n// callers know the full compact detail is available via verbose.\nexport function minimalCompactNode(entry: any): any {\n if (!entry || typeof entry !== 'object') return entry;\n const bc = entry.branchConvergence && typeof entry.branchConvergence === 'object'\n ? {\n status: entry.branchConvergence.status,\n needsConvergence: entry.branchConvergence.needsConvergence,\n reason: entry.branchConvergence.reason,\n branch: entry.branchConvergence.branch,\n }\n : undefined;\n // Canonical per-node marker fields (e.g. dataFreshness) are exactly the signal a\n // coordinator needs on a QUIET node — is this idle peer live, cached, or\n // unreachable? — and they are tiny, so re-attach them from the single canonical\n // list rather than hand-listing each one (the path the dataFreshness regression\n // slipped through when only one field was added by hand).\n const preservedMarkers: Record<string, unknown> = {};\n for (const field of MESH_COMPACT_PRESERVED_MARKER_FIELDS) {\n if (entry[field] !== undefined) preservedMarkers[field] = entry[field];\n }\n return {\n nodeId: entry.nodeId,\n workspace: entry.workspace,\n daemonId: entry.daemonId,\n health: entry.health,\n branch: entry.branch,\n launchReady: entry.launchReady,\n ...(entry.providerPriority !== undefined ? { providerPriority: entry.providerPriority } : {}),\n // Keep the routable tag set on quiet/folded nodes — a coordinator planning\n // required_tags routing needs it even for nodes with nothing to converge.\n ...(entry.capabilityTags !== undefined ? { capabilityTags: entry.capabilityTags } : {}),\n ...(entry.launchBlockedReason !== undefined ? { launchBlockedReason: entry.launchBlockedReason } : {}),\n ...(bc ? { branchConvergence: bc } : {}),\n ...(entry.sessionSummary ? { sessionSummary: entry.sessionSummary } : {}),\n ...preservedMarkers,\n folded: true,\n };\n}\n\n// Fold a node's slim session list into status/provider counts. Compact mode\n// returns this instead of the full per-session array so the payload does not\n// grow O(nodes × sessions). The self-coordinator marker is preserved as a\n// dedicated count + id list so the coordinator never mis-reads its own\n// generating CLI session as a foreign delegated task.\nexport function summarizeNodeSessions(sessions: any[]): Record<string, unknown> {\n const list = Array.isArray(sessions) ? sessions : [];\n const byStatus: Record<string, number> = {};\n const providerCounts: Record<string, number> = {};\n const selfCoordinatorSessionIds: string[] = [];\n for (const s of list) {\n const status = typeof s?.status === 'string' && s.status ? s.status : 'unknown';\n byStatus[status] = (byStatus[status] ?? 0) + 1;\n const provider = typeof s?.providerType === 'string' && s.providerType ? s.providerType : 'unknown';\n providerCounts[provider] = (providerCounts[provider] ?? 0) + 1;\n if (s?.isSelfCoordinator === true && s.id) selfCoordinatorSessionIds.push(String(s.id));\n }\n const summary: Record<string, unknown> = {\n total: list.length,\n byStatus,\n providerCounts,\n };\n if (selfCoordinatorSessionIds.length > 0) {\n summary.selfCoordinatorSessionIds = selfCoordinatorSessionIds;\n }\n return summary;\n}\n","/**\n * Work-queue view / maintenance / compaction helpers for the mesh_* tools.\n *\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change. Holds queue status/view normalization, the liveness index + stale-\n * assignment detection, maintenance reporting, and the compact row/active-work\n * folders. Imports only leaf deps (mesh-tool-shared, mesh-session-helpers) plus the\n * LocalMeshEntry type; mesh-tools.ts imports the exported helpers/constants back, so\n * there is no runtime import cycle.\n */\nimport type { LocalMeshEntry } from '@adhdev/daemon-core';\nimport { readString, elideLargeNestedValue } from './mesh-tool-shared.js';\nimport { collectNodeSessionIds } from './mesh-session-helpers.js';\n\nconst STALE_ASSIGNED_QUEUE_MS = 30 * 60_000;\nconst OLD_HISTORICAL_QUEUE_RECORD_MS = 7 * 24 * 60 * 60_000;\nexport const ACTIVE_QUEUE_STATUSES = new Set(['pending', 'assigned']);\nexport const HISTORICAL_QUEUE_STATUSES = new Set(['completed', 'failed', 'cancelled']);\nexport type QueueViewMode = 'all' | 'active' | 'historical';\n\ntype QueueLivenessIndex = {\n nodeIds: Set<string>;\n nodeSessionIds: Map<string, Set<string>>;\n};\n\nfunction buildQueueLivenessIndex(mesh?: LocalMeshEntry): QueueLivenessIndex {\n const nodeIds = new Set<string>();\n const nodeSessionIds = new Map<string, Set<string>>();\n for (const node of Array.isArray(mesh?.nodes) ? mesh.nodes : []) {\n const nodeId = readString((node as any).id) || readString((node as any).nodeId) || readString((node as any).node_id);\n if (!nodeId) continue;\n nodeIds.add(nodeId);\n const sessions = collectNodeSessionIds(node);\n if (sessions.size > 0) nodeSessionIds.set(nodeId, sessions);\n }\n return { nodeIds, nodeSessionIds };\n}\n\nfunction queueAssignmentStaleReason(task: any, liveness: QueueLivenessIndex): string | undefined {\n if (task?.status !== 'assigned') return undefined;\n const nodeId = readString(task.assignedNodeId) || readString(task.nodeId) || readString(task.node_id) || readString(task.targetNodeId);\n const sessionId = readString(task.assignedSessionId) || readString(task.sessionId) || readString(task.session_id) || readString(task.targetSessionId);\n\n if (nodeId && liveness.nodeIds.size > 0 && !liveness.nodeIds.has(nodeId)) {\n return 'assigned node is not present in the current mesh snapshot';\n }\n if (nodeId && sessionId && liveness.nodeSessionIds.has(nodeId) && !liveness.nodeSessionIds.get(nodeId)!.has(sessionId)) {\n return 'assigned session is not live on the assigned node';\n }\n\n const updatedAt = new Date(task.updatedAt).getTime();\n const ageMs = Number.isFinite(updatedAt) ? Date.now() - updatedAt : null;\n if (!nodeId && ageMs !== null && ageMs >= STALE_ASSIGNED_QUEUE_MS) {\n return 'assigned task has no assigned node metadata';\n }\n return undefined;\n}\n\nexport function buildQueueStatusSummary(queue: any[]): Record<string, unknown> {\n const counts = { pending: 0, assigned: 0, completed: 0, failed: 0, cancelled: 0 };\n let staleAssigned = 0;\n for (const task of queue) {\n const status = typeof task?.status === 'string' ? task.status : undefined;\n if (status && Object.prototype.hasOwnProperty.call(counts, status)) {\n counts[status as keyof typeof counts] += 1;\n }\n if (status === 'assigned' && task?.staleAssigned === true) staleAssigned += 1;\n }\n const liveAssigned = Math.max(0, counts.assigned - staleAssigned);\n return {\n totalCount: queue.length,\n activeCount: counts.pending + liveAssigned,\n historicalCount: counts.completed + counts.failed + counts.cancelled,\n counts,\n activeCounts: {\n pending: counts.pending,\n assigned: liveAssigned,\n },\n staleAssignedCount: staleAssigned,\n rawActiveCounts: {\n pending: counts.pending,\n assigned: counts.assigned,\n },\n historicalCounts: {\n completed: counts.completed,\n failed: counts.failed,\n cancelled: counts.cancelled,\n },\n };\n}\n\nexport function normalizeQueueViewMode(value: unknown): QueueViewMode {\n return value === 'active' || value === 'historical' || value === 'all' ? value : 'all';\n}\n\nexport function sanitizeQueueStatusFilter(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const statuses = value\n .map(item => typeof item === 'string' ? item.trim() : '')\n .filter(status => ACTIVE_QUEUE_STATUSES.has(status) || HISTORICAL_QUEUE_STATUSES.has(status));\n return statuses.length ? Array.from(new Set(statuses)) : undefined;\n}\n\nexport function filterQueueForView(queue: any[], view: QueueViewMode, statuses?: string[]): any[] {\n if (statuses?.length) {\n const allowed = new Set(statuses);\n return queue.filter(task => allowed.has(String(task?.status || '')));\n }\n if (view === 'active') return queue.filter(task => ACTIVE_QUEUE_STATUSES.has(String(task?.status || '')));\n if (view === 'historical') return queue.filter(task => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n return queue;\n}\n\nexport function prioritizeActiveQueueRows(queue: any[]): any[] {\n const active: any[] = [];\n const historical: any[] = [];\n const other: any[] = [];\n for (const task of queue) {\n const status = String(task?.status || '');\n if (ACTIVE_QUEUE_STATUSES.has(status)) active.push(task);\n else if (HISTORICAL_QUEUE_STATUSES.has(status)) historical.push(task);\n else other.push(task);\n }\n return [...active, ...other, ...historical];\n}\n\nfunction slimQueueTask(task: any): Record<string, unknown> {\n return {\n id: task?.id,\n status: task?.status,\n assignedNodeId: task?.assignedNodeId,\n assignedSessionId: task?.assignedSessionId,\n targetNodeId: task?.targetNodeId,\n targetSessionId: task?.targetSessionId,\n updatedAt: task?.updatedAt,\n staleAssigned: task?.staleAssigned === true,\n staleReason: task?.staleReason,\n };\n}\n\nexport function buildQueueMaintenanceReport(queue: any[]): Record<string, unknown> {\n const now = Date.now();\n const staleAssignedTasks = queue\n .filter(task => task?.status === 'assigned' && task?.staleAssigned === true)\n .map(slimQueueTask);\n const historicalTasks = queue.filter(task => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n const oldHistoricalTasks = historicalTasks\n .filter(task => {\n const updatedAt = new Date(task?.updatedAt).getTime();\n return Number.isFinite(updatedAt) && now - updatedAt >= OLD_HISTORICAL_QUEUE_RECORD_MS;\n })\n .map(task => ({\n ...slimQueueTask(task),\n cleanupClass: 'old_historical_record',\n reason: 'terminal queue record is older than the read-only maintenance threshold',\n }));\n const cleanupCandidates = [\n ...staleAssignedTasks.map(task => ({\n ...task,\n cleanupClass: 'stale_assigned',\n reason: typeof task.staleReason === 'string' ? task.staleReason : 'active assigned task does not match current live mesh node/session state',\n suggestedOperation: 'operator_review_then_requeue_or_cancel',\n })),\n ...oldHistoricalTasks.map(task => ({\n ...task,\n suggestedOperation: 'operator_review_then_archive_or_keep',\n })),\n ];\n return {\n readOnly: true,\n mutationPerformed: false,\n sourceOfTruth: 'mesh_work_queue_file',\n staleAssignedDefinition: 'Only active assigned queue rows are stale candidates, and only when the assigned node/session is absent from the current live mesh snapshot.',\n historicalDefinition: 'completed/failed/cancelled rows are historical ledger records and never active assignments.',\n staleAssignedTasks,\n staleAssignedCount: staleAssignedTasks.length,\n historicalRecordCount: historicalTasks.length,\n oldHistoricalRecordCount: oldHistoricalTasks.length,\n cleanupCandidates,\n cleanupCandidateCount: cleanupCandidates.length,\n };\n}\n\n// Compact maintenance report: drop the per-row arrays (staleAssignedTasks,\n// cleanupCandidates) that scale with old historical record count and instead\n// surface the counts. staleAssignedTasks rows are still active work, so keep a\n// small sample for coordinator visibility; cleanupCandidates are dominated by\n// old historical rows and are dropped entirely in favor of the count + a hint.\nexport function buildCompactQueueMaintenanceReport(maintenance: Record<string, unknown>): Record<string, unknown> {\n const staleAssignedTasks = Array.isArray((maintenance as any).staleAssignedTasks)\n ? (maintenance as any).staleAssignedTasks\n : [];\n const cleanupCandidateCount = (maintenance as any).cleanupCandidateCount ?? 0;\n return {\n readOnly: true,\n mutationPerformed: false,\n sourceOfTruth: 'mesh_work_queue_file',\n payloadMode: 'compact',\n staleAssignedDefinition: (maintenance as any).staleAssignedDefinition,\n historicalDefinition: (maintenance as any).historicalDefinition,\n // staleAssignedTasks are active assigned rows (not historical) — retain a\n // bounded sample so coordinators can still see drift without the full array.\n staleAssignedTasks: staleAssignedTasks.slice(0, 5),\n staleAssignedSampleLimit: 5,\n staleAssignedCount: (maintenance as any).staleAssignedCount ?? staleAssignedTasks.length,\n historicalRecordCount: (maintenance as any).historicalRecordCount ?? 0,\n oldHistoricalRecordCount: (maintenance as any).oldHistoricalRecordCount ?? 0,\n cleanupCandidateCount,\n cleanupCandidatesOmitted: true,\n cleanupCandidatesHint: 'Per-row cleanup candidates are omitted in compact mode; call mesh_view_queue with verbose=true for the full maintenance/cleanupDryRun rows.',\n };\n}\n\n// Compact-mode bounds for mesh_view_queue active rows. Active (pending/assigned)\n// rows are kept — they drive dispatch decisions — but a busy mesh can have dozens\n// of them, each carrying the full task `message` (often multi-KB). Truncate the\n// message and cap the row count so the active queue can't blow the token cap.\nexport const COMPACT_MAX_ACTIVE_QUEUE_ROWS = 15;\nconst COMPACT_QUEUE_MESSAGE_CAP = 140;\nexport const COMPACT_MAX_ACTIVE_WORK_ROWS = 12;\n// In compact mode an activeWork row keeps a single short title only; the original\n// delegation prompt is NOT echoed (leak #2). 80 chars is enough to recognize the task.\nconst COMPACT_ACTIVE_WORK_TITLE_CAP = 80;\n\nfunction truncateForCompact(value: unknown, cap: number): unknown {\n if (typeof value !== 'string') return value;\n return value.length > cap ? value.slice(0, cap) + '…' : value;\n}\n\n// Slim an active queue row for compact mode: truncate the long free-text message\n// and elide any oversized nested field. Status/ids/deps/tags (the dispatch-relevant\n// scalars) are preserved.\nexport function compactQueueRow(task: any): any {\n if (!task || typeof task !== 'object') return task;\n const slim: any = {};\n for (const [k, v] of Object.entries(task)) {\n if (k === 'message') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else slim[k] = elideLargeNestedValue(k, v);\n }\n return slim;\n}\n\nexport function compactQueueRows(rows: any[]): { rows: any[]; omitted: number } {\n const capped = rows.slice(0, COMPACT_MAX_ACTIVE_QUEUE_ROWS).map(compactQueueRow);\n return { rows: capped, omitted: Math.max(0, rows.length - capped.length) };\n}\n\n// Slim an activeWork record for compact mode. Leak #2: the original delegation\n// prompt was echoed THREE times per row — `taskTitle` (truncated) + `taskSummary`\n// (mid-length) + `message` (full). In compact we keep only a single short\n// `taskTitle`; `taskSummary` and `message` are dropped entirely (the full text is\n// available via mesh_task_history or with verbose=true). All dispatch-relevant\n// scalars (taskId/status/nodeId/sessionId/timestamps/terminal+stale flags) are\n// preserved so the row stays actionable.\nfunction compactActiveWorkRecord(record: any): any {\n if (!record || typeof record !== 'object') return record;\n const slim: any = {};\n for (const [k, v] of Object.entries(record)) {\n if (k === 'message' || k === 'taskSummary') continue; // redundant full-text echoes\n else if (k === 'taskTitle') slim[k] = truncateForCompact(v, COMPACT_ACTIVE_WORK_TITLE_CAP);\n else slim[k] = elideLargeNestedValue(k, v);\n }\n return slim;\n}\n\nexport function compactActiveWorkRecords(records: any[]): { records: any[]; omitted: number } {\n if (!Array.isArray(records)) return { records, omitted: 0 };\n const capped = records.slice(0, COMPACT_MAX_ACTIVE_WORK_ROWS).map(compactActiveWorkRecord);\n return { records: capped, omitted: Math.max(0, records.length - capped.length) };\n}\n\nexport function annotateQueueStaleness(queue: any[], mesh?: LocalMeshEntry): any[] {\n const liveness = buildQueueLivenessIndex(mesh);\n const now = Date.now();\n return queue.map(task => {\n const taskStatus = typeof task?.status === 'string' ? task.status : undefined;\n const annotated = {\n ...task,\n taskStatus,\n isActive: taskStatus ? ACTIVE_QUEUE_STATUSES.has(taskStatus) : false,\n isHistorical: taskStatus ? HISTORICAL_QUEUE_STATUSES.has(taskStatus) : false,\n dispatchedAt: task?.createdAt,\n ...(taskStatus === 'assigned' ? { activeTaskId: task.id } : {}),\n ...(taskStatus === 'completed' || taskStatus === 'failed' ? {\n completedAt: task.updatedAt,\n } : {}),\n };\n if (taskStatus !== 'assigned') return annotated;\n const updatedAt = new Date(task.updatedAt).getTime();\n const ageMs = Number.isFinite(updatedAt) ? now - updatedAt : null;\n const staleReason = queueAssignmentStaleReason(task, liveness);\n if (!staleReason) return annotated;\n return {\n ...annotated,\n stale: true,\n staleAssigned: true,\n staleReason,\n ...(ageMs !== null ? { assignedAgeMs: ageMs } : {}),\n };\n });\n}\n","export const RAPID_READ_CHAT_ADVISORY_WINDOW_MS = 5_000;\n\nconst ACTIVE_READ_STATUSES = new Set([\n 'generating',\n 'running',\n 'streaming',\n 'starting',\n 'busy',\n]);\n\ntype RecentRead = {\n at: number;\n status?: string;\n};\n\nexport type RapidReadChatAdvisory = {\n type: 'rapid_read_chat_polling';\n toolName: string;\n windowMs: number;\n elapsedMs: number;\n nextSuggestedReadAt: number;\n completionCallbackExpected: boolean;\n message: string;\n};\n\nconst recentReads = new Map<string, RecentRead>();\n\nexport function clearRapidReadChatAdvisoryStateForTests(): void {\n recentReads.clear();\n}\n\nexport function isActiveReadChatStatus(status: unknown): boolean {\n return typeof status === 'string' && ACTIVE_READ_STATUSES.has(status.toLowerCase());\n}\n\nexport function annotateRapidReadChatAdvisory<T extends Record<string, any>>(\n payload: T,\n options: {\n key: string;\n now?: number;\n status?: unknown;\n toolName: 'read_chat' | 'mesh_read_chat' | string;\n completionCallbackExpected?: boolean;\n },\n): T & { pollingAdvisory?: RapidReadChatAdvisory } {\n const now = options.now ?? Date.now();\n const status = options.status ?? payload?.status ?? payload?.data?.status ?? payload?.result?.status;\n const active = isActiveReadChatStatus(status);\n const previous = recentReads.get(options.key);\n\n if (!active) {\n recentReads.set(options.key, { at: now, status: typeof status === 'string' ? status : undefined });\n return payload;\n }\n\n recentReads.set(options.key, { at: now, status: typeof status === 'string' ? status : undefined });\n\n if (!previous || !isActiveReadChatStatus(previous.status)) return payload;\n const elapsedMs = now - previous.at;\n if (elapsedMs < 0 || elapsedMs >= RAPID_READ_CHAT_ADVISORY_WINDOW_MS) return payload;\n\n return {\n ...payload,\n pollingAdvisory: {\n type: 'rapid_read_chat_polling',\n toolName: options.toolName,\n windowMs: RAPID_READ_CHAT_ADVISORY_WINDOW_MS,\n elapsedMs,\n nextSuggestedReadAt: previous.at + RAPID_READ_CHAT_ADVISORY_WINDOW_MS,\n completionCallbackExpected: Boolean(options.completionCallbackExpected),\n message: `This session is still ${String(status)}. Avoid repeated ${options.toolName} polling for the same generating session; wait for the completion callback/status event or retry after the suggested time if you are debugging a real stall.`,\n },\n };\n}\n","// Mesh tool implementations — status domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n COMPACT_DETAILED_NODES_BYTE_BUDGET,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n COMPACT_MISSIONS_BYTE_BUDGET,\n COMPACT_NODES_TOTAL_BYTE_BUDGET,\n assignFullGitSnapshot,\n buildActiveWorkPollingGuidance,\n buildBranchConvergence,\n buildCompactStaleDirectWorkSummary,\n buildCoordinatorP2pRelayFailure,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n buildMeshNodeProbeFreshness,\n buildMeshSchedulingRuntime,\n buildNodeCapabilityExposure,\n buildNodeMachineIdentity,\n collectLiveStatusProbe,\n collectRelatedRepoStatuses,\n commandForNode,\n compactActiveWorkRecords,\n compactMeshStatusNode,\n compactNodeSeverity,\n computeMeshMissionStats,\n countUncommittedChanges,\n drainCoordinatorPendingEvents,\n extractGitStatus,\n extractSubmodules,\n getActiveDirectDispatches,\n getLatestActiveLaunchFailure,\n getLedgerSummary,\n getMeshStatusMissionSummaries,\n getMeshStatusMissionsCompact,\n getNodeLaunchReadiness,\n getQueue,\n getSessionRecoveryContext,\n isGitStatusDirty,\n isNoteworthyCompactNode,\n minimalCompactNode,\n readLedgerEntries,\n readNodeDaemonId,\n readNodeMachineId,\n readRelatedRepos,\n reconcileDirectDispatchesFromTranscriptEvidence,\n recordMeshToolCall,\n refreshMeshFromDaemon,\n summarizeBranchConvergence,\n summarizeMeshAsyncRefineJobs,\n summarizeNodeSessions,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\n\n\n// ─── Tool Implementations ───────────────────────\n\nexport async function meshStatus(ctx: MeshContext, args: { includeStaleDirectWorkDetails?: boolean; includeTerminalDirectWork?: boolean; includeSessions?: boolean; compact?: boolean; verbose?: boolean } = {}): Promise<string> {\n const rateResult = recordMeshToolCall({ meshId: ctx.mesh.id, tool: 'mesh_status' });\n // Default to the slim payload for LLM callers; verbose forces the full payload.\n const compact = args.verbose === true ? false : (args.compact ?? true);\n\n await refreshMeshFromDaemon(ctx);\n const { mesh, transport } = ctx;\n\n let ledgerSummary = getLedgerSummary(mesh.id);\n\n // Scheduling-runtime projection (load-balancer's live view): tie-break strategy,\n // global parallel caps + consumption, and per-node load / priority / provider caps\n // with structured \"why this node can't take more write work\" reasons. Derived from\n // the mesh config + a queue snapshot (read-only) — never drives a scheduling\n // decision, only exposes the picture the claim path acts on. Computed once so each\n // node entry below can attach its slice and the response can carry the mesh rollup.\n const schedulingRuntime = buildMeshSchedulingRuntime(mesh, getQueue(mesh.id));\n const schedulingByNode = new Map(schedulingRuntime.nodes.map(n => [n.nodeId, n]));\n\n // Probe all nodes in parallel — git_status + session collection per node are independent.\n const results = await Promise.all(mesh.nodes.map(async (node) => {\n const entry: any = {\n nodeId: node.id,\n workspace: node.workspace,\n machine: buildNodeMachineIdentity(ctx, node),\n daemonId: readNodeDaemonId(node),\n machineId: readNodeMachineId(node),\n ...getNodeLaunchReadiness(node),\n ...buildNodeCapabilityExposure(node),\n };\n\n // Per-node scheduling runtime (load, priority, provider caps, claim-block reasons).\n // Full detail is a dashboard/verbose concern; in compact mode it repeats per node\n // and would inflate the LLM payload past its byte budget, so compact keeps only the\n // two scalars a coordinator needs to reason about load (current load + cap-reached).\n // The mesh-level scheduling rollup (strategy/global caps) is always present below.\n const nodeScheduling = schedulingByNode.get(node.id);\n if (nodeScheduling) {\n // Drop the redundant nodeId — the entry already carries it.\n const { nodeId: _omit, ...rest } = nodeScheduling;\n entry.scheduling = compact\n ? { load: rest.load, capReached: rest.capReached }\n : rest;\n }\n\n // Tracks whether THIS call obtained live truth from a fresh git_status probe.\n // The coordinator-facing mesh_status always probes each node fresh, so a probe\n // that returns is live truth and a probe that throws is an unreachable peer —\n // consumed below to stamp the additive `dataFreshness` marker.\n let liveTruthProbed = false;\n try {\n const autoDiscover = (node.policy as any)?.autoDiscoverSubmodules !== false;\n const statusResult = await commandForNode(ctx, node, 'git_status', {\n workspace: node.workspace,\n refreshUpstream: true,\n includeSubmodules: autoDiscover,\n submoduleIgnorePaths: (node.policy as any)?.submoduleIgnorePaths || undefined,\n });\n liveTruthProbed = true;\n const status = extractGitStatus(statusResult);\n const uncommittedChanges = countUncommittedChanges(status);\n const dirty = isGitStatusDirty(status);\n entry.health = status?.isGitRepo ? (dirty ? 'dirty' : 'online') : 'degraded';\n assignFullGitSnapshot(entry, status);\n entry.branch = status?.branch;\n entry.isDirty = dirty;\n entry.uncommittedChanges = uncommittedChanges;\n entry.branchConvergence = buildBranchConvergence(mesh, node, status, dirty, uncommittedChanges);\n // Stale-daemon-build warning: the live daemon's build commit is a\n // strict ancestor of this workspace HEAD (or its oss submodule),\n // meaning merged code is not yet live (awaiting deploy/restart).\n // Computed git-correctly on the daemon side (git_status →\n // daemonBuildBehind); surfaced here as a top-level node field.\n if (status?.daemonBuildBehind && typeof status.daemonBuildBehind === 'object') {\n entry.staleDaemonBuild = status.daemonBuildBehind;\n }\n // Submodule out-of-sync warning\n const submodules = extractSubmodules(statusResult, (node.policy as any)?.submoduleIgnorePaths || []);\n if (submodules && submodules.some((s: any) => s?.outOfSync)) {\n entry.submoduleWarning = 'One or more submodules are out of sync with the parent repo. Run `git submodule update` or check deployment readiness.';\n entry.outOfSyncSubmodules = submodules.filter((s: any) => s?.outOfSync).map((s: any) => s.path);\n }\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'git_status',\n targetDaemonId: node.daemonId,\n nodeId: node.id,\n });\n entry.health = 'degraded';\n entry.error = failure.error;\n entry.degradedReason = failure.recoverable ? 'p2p_relay_failure' : 'git_status_unavailable';\n Object.assign(entry, {\n code: failure.code,\n transport: failure.transport,\n recoverable: failure.recoverable,\n retryRecommended: failure.retryRecommended,\n nextAction: failure.nextAction,\n noFallbackReason: failure.noFallbackReason,\n });\n }\n\n // Additive freshness/reachability marker. Without this, the coordinator's\n // mesh_status could not tell a node whose live probe just succeeded from one\n // it could not reach — both rendered as `health` + git scalars only. Derived\n // through the SINGLE canonical daemon-core live-probe adapter\n // (buildMeshNodeProbeFreshness) rather than rebuilding the freshness input\n // here, so the dataSource/staleness wiring cannot drift between this\n // coordinator surface and the daemon aggregate (the rc.371 regression where\n // dataFreshness was wired on the daemon surface but null on every coordinator\n // node because this site re-derived its own input).\n entry.dataFreshness = buildMeshNodeProbeFreshness({\n git: entry.git,\n liveTruthProbed,\n isSelfNode: (entry.machine as any)?.sameMachine === true,\n daemonId: readNodeDaemonId(node),\n node,\n });\n\n // Recovery Hints & Next-step reporting\n const recoveryContext = getSessionRecoveryContext(mesh.id, { nodeId: node.id });\n if (recoveryContext.consecutiveNodeFailures > 0) {\n entry.recoveryHints = {\n consecutiveFailures: recoveryContext.consecutiveNodeFailures,\n lastTaskMessage: typeof recoveryContext.lastTaskMessage === 'string'\n ? recoveryContext.lastTaskMessage.slice(0, 100) + (recoveryContext.lastTaskMessage.length > 100 ? '…' : '')\n : recoveryContext.lastTaskMessage,\n advice: recoveryContext.advice,\n retryRecommended: recoveryContext.retryRecommended,\n };\n }\n\n const activeLaunchFailure = getLatestActiveLaunchFailure(mesh.id, node.id);\n if (activeLaunchFailure && node.isLocalWorktree) {\n entry.health = 'degraded';\n entry.degradedReason = 'worktree_launch_failed';\n entry.launchReady = false;\n entry.launchBlockedReason = activeLaunchFailure.code || 'mesh_launch_failed';\n entry.launchBlockedMessage = activeLaunchFailure.error || 'Previous worktree session launch failed';\n entry.lastLaunchFailure = activeLaunchFailure;\n }\n\n const nextStepHints: string[] = [];\n if (entry.degradedReason === 'worktree_launch_failed') {\n nextStepHints.push(`Retry mesh_launch_session(node_id: \"${node.id}\") after daemon mesh transport/P2P is healthy.`);\n nextStepHints.push(`If retry is not desired, cleanup the orphan worktree node with mesh_remove_node(node_id: \"${node.id}\").`);\n } else if (entry.health === 'online' && node.isLocalWorktree) {\n nextStepHints.push(`Merge worktree to base via mesh_refine_node(node_id: \"${node.id}\")`);\n } else if (entry.health === 'dirty') {\n nextStepHints.push(`Commit changes via mesh_checkpoint(node_id: \"${node.id}\", message: \"...\")`);\n } else if (entry.health === 'degraded' && entry.error?.includes('git')) {\n nextStepHints.push('Initialize git repository or check workspace path.');\n }\n\n if (entry.branchConvergence?.needsConvergence === true && entry.branchConvergence.nextStep) {\n nextStepHints.push(String(entry.branchConvergence.nextStep));\n }\n\n if (recoveryContext.consecutiveNodeFailures > 0) {\n if (recoveryContext.retryRecommended) {\n nextStepHints.push(`Retry task on this node or launch a fresh session.`);\n } else {\n nextStepHints.push(`Consider reassigning work to a different node.`);\n }\n }\n\n if (nextStepHints.length > 0) {\n entry.nextStepHints = nextStepHints;\n }\n\n const relatedRepos = await collectRelatedRepoStatuses(ctx, node);\n if (relatedRepos.length) entry.relatedRepos = relatedRepos;\n\n const statusProbe = await collectLiveStatusProbe(ctx, node);\n const liveSessions = statusProbe.sessions;\n // Per-node daemon build stamp (commit/version of the running daemon).\n // Compact mode folds these per-daemonId at the response level, but the\n // raw field is kept on the node so verbose callers and self-coordinator\n // shape stay intact.\n if (statusProbe.daemonBuild) entry.daemonBuild = statusProbe.daemonBuild;\n if (liveSessions.length > 0) {\n // Slim to essential fields only — full session objects are expensive in coordinator context.\n entry.sessions = liveSessions\n .map((s: any) => {\n // A session is marked as a coordinator for THIS mesh when the daemon's\n // coordinator registry / session settings report its meshId matches ours.\n // From the caller's perspective (which is itself a coordinator for this\n // mesh), any such session is \"self\" — i.e. it is the calling coordinator\n // session, not a foreign delegated worker. This prevents the coordinator\n // from mis-reporting its own generating CLI session as someone else's\n // delegated task.\n const coordinatorMeshId =\n typeof s.coordinator?.meshId === 'string' ? s.coordinator.meshId : undefined;\n const isSelfCoordinator = coordinatorMeshId === mesh.id;\n return {\n id: s.instanceId ?? s.id ?? s.sessionId,\n status: s.status ?? s.lifecycle ?? s.state,\n providerType: s.providerType ?? s.cliType ?? s.type,\n ...(s.activeChat?.status ? { chatStatus: s.activeChat.status } : {}),\n ...(isSelfCoordinator ? { isSelfCoordinator: true, role: 'coordinator' as const } : {}),\n // [T2] Carry the worker-computed last-message preview through the slim so\n // the coordinator's inbox can show the worker's latest ASSISTANT reply\n // without re-deriving it from a live in-process instance it doesn't host.\n // The worker's get_status_metadata snapshot already computes these\n // (status/snapshot.ts) from its real transcript; dropping them here forced\n // the coordinator down a derive path that fails for genuinely remote\n // workers, leaving the mobile inbox stuck on the dispatched user task.\n ...(typeof s.lastMessagePreview === 'string' && s.lastMessagePreview\n ? { lastMessagePreview: s.lastMessagePreview } : {}),\n ...(typeof s.lastMessageRole === 'string' && s.lastMessageRole\n ? { lastMessageRole: s.lastMessageRole } : {}),\n ...(typeof s.lastMessageAt === 'number' && Number.isFinite(s.lastMessageAt)\n ? { lastMessageAt: s.lastMessageAt } : {}),\n };\n })\n // Exclude sessions with no resolvable id (malformed or custom provider response).\n .filter((s: any) => s.id);\n }\n\n return entry;\n }));\n\n let ledgerEntries = readLedgerEntries(mesh.id, { tail: 200 });\n let directDispatches = getActiveDirectDispatches(mesh.id);\n const directReconciliation = await reconcileDirectDispatchesFromTranscriptEvidence(ctx, results, directDispatches, ledgerEntries);\n if (directReconciliation.reconciled > 0) {\n ledgerEntries = readLedgerEntries(mesh.id, { tail: 200 });\n directDispatches = getActiveDirectDispatches(mesh.id);\n ledgerSummary = getLedgerSummary(mesh.id);\n }\n const activeWorkEvidence = buildMeshActiveWork({\n meshId: mesh.id,\n queue: getQueue(mesh.id),\n ledgerEntries,\n directDispatches,\n nodes: results,\n });\n\n const pollingGuidance = buildActiveWorkPollingGuidance(activeWorkEvidence.summary);\n const staleDirectWorkSummary = buildCompactStaleDirectWorkSummary(activeWorkEvidence.staleDirectWork, {\n note: activeWorkEvidence.staleDirectWorkNote,\n detailHint: 'Full stale direct entries are omitted from mesh_status by default. Call mesh_status with includeStaleDirectWorkDetails=true or inspect mesh_task_history for ledger detail.',\n });\n // Leak #2: in compact mode each activeWork row drops the duplicated\n // taskSummary/message echoes (keeps a short taskTitle + dispatch scalars).\n // Verbose keeps the full per-record text for debugging.\n const activeWorkForResponse = compact\n ? compactActiveWorkRecords(activeWorkEvidence.activeWork)\n : { records: activeWorkEvidence.activeWork, omitted: 0 };\n\n // Surface coordinator session identity at the top level so the caller (which\n // is itself a coordinator for this mesh) can immediately recognize which\n // sessions in the response are its own — see the per-session\n // `isSelfCoordinator` marker derived above.\n const coordinatorSessions: Array<Record<string, unknown>> = [];\n for (const nodeEntry of results) {\n const sessions = Array.isArray((nodeEntry as any).sessions) ? (nodeEntry as any).sessions : [];\n for (const s of sessions) {\n if (s?.isSelfCoordinator === true && s.id) {\n coordinatorSessions.push({\n nodeId: (nodeEntry as any).nodeId,\n sessionId: s.id,\n providerType: s.providerType,\n status: s.status,\n });\n }\n }\n }\n\n // Compact mode: slim each node's large duplicated `git` blob down to the\n // coordinator-relevant scalars + submodules. branch/health/headCommit/ahead/\n // behind/dirty/upstreamStatus/branchConvergence live as top-level node\n // fields (or inside the slim git snapshot) and are always preserved.\n //\n // Session N×M de-duplication: the per-node session list comes from a\n // daemon-wide `get_status_metadata` probe, so every node that shares a\n // daemonId reports the SAME sessions. Emitting the full array on every node\n // makes the payload grow O(nodes × sessions). In compact mode we therefore\n // (a) fold each node's `sessions` array to a `sessionSummary` (counts only),\n // and (b) emit the full slim session arrays exactly once per daemon under\n // top-level `daemonSessions`. The self-coordinator marker survives in both\n // the per-node summary (`selfCoordinatorSessionIds`) and the top-level\n // `coordinatorSessions`/`selfIdentification`. Individual per-node session\n // detail can be opted back in with `includeSessions=true`.\n const includeSessions = args.includeSessions === true;\n // Top-level per-daemon session map (compact). Sessions are recorded ONCE per\n // daemonId regardless of how many mesh nodes share that daemon, eliminating\n // the N×M duplication. With includeSessions=true the full slim session arrays\n // are emitted; otherwise each daemon is folded to a counts summary.\n const daemonSessions: Record<string, unknown> = {};\n if (compact) {\n const seenDaemons = new Set<string>();\n for (const entry of results as any[]) {\n const daemonId = typeof entry?.daemonId === 'string' && entry.daemonId ? entry.daemonId : '';\n const sessions = Array.isArray(entry?.sessions) ? entry.sessions : [];\n if (daemonId && sessions.length > 0 && !seenDaemons.has(daemonId)) {\n seenDaemons.add(daemonId);\n daemonSessions[daemonId] = includeSessions ? sessions : summarizeNodeSessions(sessions);\n }\n }\n }\n // Per-daemon build fold: the daemon build stamp is identical for every node\n // sharing a daemonId (it's a daemon-wide probe), so record it ONCE per\n // daemonId at the top level. Small field — emitted in both compact and\n // verbose modes so the coordinator can compare the live daemon's commit with\n // a just-merged fix without paging through nodes.\n const daemonBuilds: Record<string, unknown> = {};\n for (const entry of results as any[]) {\n const daemonId = typeof entry?.daemonId === 'string' && entry.daemonId ? entry.daemonId : '';\n if (daemonId && entry?.daemonBuild && !(daemonId in daemonBuilds)) {\n daemonBuilds[daemonId] = entry.daemonBuild;\n }\n }\n // Stale-build aggregate: any node whose live daemon build is behind its\n // workspace HEAD. Deduplicated per daemonId+scope so N worktrees on one\n // stale daemon don't spam N identical warnings.\n const staleDaemonBuilds: Array<Record<string, unknown>> = [];\n const seenStale = new Set<string>();\n for (const entry of results as any[]) {\n const behind = entry?.staleDaemonBuild;\n if (!behind || typeof behind !== 'object') continue;\n const daemonId = typeof entry?.daemonId === 'string' ? entry.daemonId : '';\n const key = `${daemonId}::${behind.scope ?? ''}::${behind.buildCommit ?? ''}::${behind.head ?? ''}`;\n if (seenStale.has(key)) continue;\n seenStale.add(key);\n // web-only stale builds are informational, not \"fix not live\". Only daemon-\n // affecting stale builds (or ones where the classification is unknown →\n // defaulted true) mean a merged daemon/refinery fix is not yet live.\n const isDaemonAffecting = behind.isDaemonAffecting !== false;\n staleDaemonBuilds.push({\n daemonId,\n nodeId: entry.nodeId,\n scope: behind.scope,\n liveBuildCommit: behind.buildCommit,\n liveBuildCommitShort: behind.buildCommitShort,\n head: behind.head,\n isDaemonAffecting,\n ...(Array.isArray(behind.affectedPackages) && behind.affectedPackages.length > 0\n ? { affectedPackages: behind.affectedPackages }\n : {}),\n // The full ~300-char warning prose is identical for every entry and is\n // already emitted ONCE at the top level as `staleDaemonBuildWarning`.\n // Keep it per-entry only in verbose to avoid N× duplication in compact.\n ...(compact ? {} : { warning: behind.warning }),\n });\n }\n const daemonAffectingStaleBuilds = staleDaemonBuilds.filter((b) => b.isDaemonAffecting !== false);\n const webOnlyStaleBuilds = staleDaemonBuilds.filter((b) => b.isDaemonAffecting === false);\n\n let stubbedNodeCount = 0;\n let foldedNodesSummary: Record<string, unknown> | undefined;\n const nodesForResponse = compact\n ? (() => {\n const compacted = results.map((entry: any) => {\n const next = compactMeshStatusNode(entry);\n if (!next || typeof next !== 'object') return next;\n if (Array.isArray(next.sessions)) {\n next.sessionSummary = summarizeNodeSessions(next.sessions);\n // Drop the full per-node array unless explicitly opted in. The\n // de-duplicated full lists are available under top-level\n // `daemonSessions` keyed by daemonId.\n if (!includeSessions) delete next.sessions;\n }\n // Build stamp is folded per-daemon under top-level `daemonBuilds`;\n // drop the repetitive per-node copy in compact mode.\n if (next.daemonBuild !== undefined) delete next.daemonBuild;\n return next;\n });\n\n // Two-tier bounding, highest-severity first:\n // 1. detail byte-budget — noteworthy nodes get full compact detail until\n // COMPACT_DETAILED_NODES_BYTE_BUDGET is spent; the rest degrade to a stub.\n // 2. total node-array byte-budget — quiet/overflow nodes are emitted as\n // minimal stubs until COMPACT_NODES_TOTAL_BYTE_BUDGET is spent; any node\n // beyond that is fully folded into the foldedNodes id-list summary.\n // Nodes that survive in the array keep their ORIGINAL order. Every node id is\n // either in the array (detail or stub) or listed in foldedNodes.nodeIds.\n const noteworthy = compacted.filter((n: any) => n && typeof n === 'object' && isNoteworthyCompactNode(n));\n const ranked = [...noteworthy].sort((a, b) => compactNodeSeverity(b) - compactNodeSeverity(a));\n const detailedIds = new Set<string>();\n let detailSpent = 0;\n for (const n of ranked) {\n const cost = JSON.stringify(n).length + 1;\n if (detailedIds.size === 0 || detailSpent + cost <= COMPACT_DETAILED_NODES_BYTE_BUDGET) {\n detailedIds.add(String(n.nodeId));\n detailSpent += cost;\n }\n }\n\n // severity order for awarding the remaining total budget to stubs\n const stubOrder = [...compacted]\n .filter((n: any) => n && typeof n === 'object')\n .sort((a, b) => compactNodeSeverity(b) - compactNodeSeverity(a));\n const keptIds = new Set<string>(detailedIds);\n let totalSpent = detailSpent;\n for (const n of stubOrder) {\n const id = String(n.nodeId);\n if (keptIds.has(id)) continue;\n const stubCost = JSON.stringify(minimalCompactNode(n)).length + 1;\n if (totalSpent + stubCost <= COMPACT_NODES_TOTAL_BYTE_BUDGET) {\n keptIds.add(id);\n totalSpent += stubCost;\n }\n }\n\n const fullyFolded: any[] = [];\n const out = compacted\n .map((n: any) => {\n if (!n || typeof n !== 'object') return n;\n const id = String(n.nodeId);\n if (detailedIds.has(id)) return n;\n if (keptIds.has(id)) {\n stubbedNodeCount += 1;\n return minimalCompactNode(n);\n }\n fullyFolded.push(n);\n return null;\n })\n .filter((n: any) => n !== null);\n\n if (fullyFolded.length > 0) {\n const byBranchConvergence: Record<string, number> = {};\n const byHealth: Record<string, number> = {};\n const nodeIds: string[] = [];\n for (const n of fullyFolded) {\n const bc = typeof n?.branchConvergence?.status === 'string' ? n.branchConvergence.status : 'unknown';\n byBranchConvergence[bc] = (byBranchConvergence[bc] ?? 0) + 1;\n const h = typeof n?.health === 'string' ? n.health : 'unknown';\n byHealth[h] = (byHealth[h] ?? 0) + 1;\n if (n?.nodeId) nodeIds.push(String(n.nodeId));\n }\n foldedNodesSummary = {\n count: fullyFolded.length,\n note: 'Node-array byte budget reached: these nodes are listed by id only. Query a specific node_id or use verbose=true for their detail.',\n byHealth,\n byBranchConvergence,\n nodeIds,\n };\n }\n return out;\n })()\n : results;\n\n const response: Record<string, unknown> = {\n meshId: mesh.id,\n meshName: mesh.name,\n repoIdentity: mesh.repoIdentity,\n policy: mesh.policy,\n // Mesh-level scheduling rollup (strategy + global cap consumption). Per-node\n // detail (load/priority/provider caps/claim-block reasons) lives on each\n // nodes[].scheduling; the node array is dropped here to avoid duplicating it.\n scheduling: {\n strategy: schedulingRuntime.strategy,\n maxParallelTasks: schedulingRuntime.maxParallelTasks,\n maxReadonlyParallelTasks: schedulingRuntime.maxReadonlyParallelTasks,\n activeWriteAssigned: schedulingRuntime.activeWriteAssigned,\n activeReadonlyAssigned: schedulingRuntime.activeReadonlyAssigned,\n globalWriteCapReached: schedulingRuntime.globalWriteCapReached,\n globalReadonlyCapReached: schedulingRuntime.globalReadonlyCapReached,\n },\n payloadMode: compact ? 'compact' : 'full',\n refreshedAt: new Date().toISOString(),\n sourceOfTruth: {\n membership: 'coordinator_daemon_live_mesh',\n currentStatus: 'live_git_and_session_probes',\n activeWork: 'mesh_queue_file_and_local_ledger',\n historicalEvidenceOnly: ['recoveryHints', 'ledgerSummary'],\n },\n nodes: nodesForResponse,\n ...(compact && stubbedNodeCount > 0\n ? {\n stubbedNodesNote: `${stubbedNodeCount} node(s) in the array above are reduced to a minimal stub (marked folded:true) in compact mode — healthy/clean nodes plus any beyond the detail byte-budget. They remain addressable by node_id; use verbose=true for their full detail.`,\n }\n : {}),\n ...(compact && foldedNodesSummary ? { foldedNodes: foldedNodesSummary } : {}),\n ...(compact && Object.keys(daemonSessions).length > 0 ? { daemonSessions } : {}),\n ...(Object.keys(daemonBuilds).length > 0 ? { daemonBuilds } : {}),\n ...(staleDaemonBuilds.length > 0 ? { staleDaemonBuilds } : {}),\n ...(daemonAffectingStaleBuilds.length > 0\n ? {\n staleDaemonBuildWarning: 'One or more live daemons were built from a commit behind the workspace HEAD with daemon-runtime package changes. Merged refinery/mesh-tool fixes are NOT live on those daemons until they are rebuilt/redeployed and restarted — a local daemon-core dist rebuild does not update a cloud daemon. Do not assume a just-merged fix is active.',\n }\n : {}),\n ...(webOnlyStaleBuilds.length > 0\n ? {\n webOnlyStaleBuildNote: 'One or more live daemons are behind workspace HEAD, but only web packages changed in that range. The daemon does NOT need a rebuild/restart — redeploy the web app to reflect those changes. This is informational, not a \"fix not live\" condition.',\n }\n : {}),\n activeWork: activeWorkForResponse.records,\n ...(compact && activeWorkForResponse.omitted > 0\n ? { activeWorkRowsOmitted: activeWorkForResponse.omitted }\n : {}),\n ...(compact\n ? { activeWorkHint: `Compact activeWork rows carry a short taskTitle + dispatch scalars only; full task prompt/summary text is omitted — use mesh_task_history or mesh_status verbose=true. First ${COMPACT_MAX_ACTIVE_WORK_ROWS} rows serialized.` }\n : {}),\n staleDirectWorkSummary,\n ...(args.includeStaleDirectWorkDetails === true ? { staleDirectWork: activeWorkEvidence.staleDirectWork } : {}),\n // terminalDirectWork is historical (completed/failed direct dispatches) — opt-in only.\n ...(args.includeTerminalDirectWork === true ? { terminalDirectWork: activeWorkEvidence.terminalDirectWork } : {}),\n activeWorkSummary: activeWorkEvidence.summary,\n ...(pollingGuidance ? { pollingGuidance } : {}),\n ...(rateResult.rateLimitExceeded ? { pollingRateAdvisory: { type: 'rate_limit_exceeded', tool: 'mesh_status', callsInWindow: rateResult.callsInWindow, message: rateResult.advisory } } : {}),\n branchConvergenceSummary: summarizeBranchConvergence(results, compact),\n ...(coordinatorSessions.length > 0\n ? {\n coordinatorSessions,\n selfIdentification: {\n meshId: mesh.id,\n coordinatorSessions,\n note: 'Sessions listed here are coordinator sessions for this mesh. The calling coordinator IS one of these sessions — do not treat its own generating CLI session as a foreign delegated task. Per-session marker: sessions[].isSelfCoordinator === true.',\n },\n }\n : {}),\n };\n\n // Include task ledger summary for coordinator context\n try {\n response.ledgerSummary = ledgerSummary;\n } catch { /* ledger read is best-effort */ }\n\n // M3-2: mission summaries — goal + live task aggregates (derived, not stored).\n // M7: each mission also carries time/attempt stats derived from the ledger.\n //\n // The missions section previously dominated the compact payload: every live\n // mission AND up to 10 history missions were emitted in full (goalPreview +\n // tasks + a per-mission stats rollup) on every poll, so a mesh with many\n // missions pushed mesh_status past the MCP token cap. Compact mode now folds\n // missions like it folds nodes/sessions:\n // • live (active/paused) missions keep detail, goal-elided to a tight preview\n // and WITHOUT the stats rollup (the tasks aggregate already carries\n // progress; stats is a verbose/dashboard concern);\n // • completed/abandoned history is folded to a counts + id summary\n // (missionsHistory) instead of full per-mission detail;\n // • a byte budget bounds the live array — overflow folds into foldedMissions\n // (id list), so even a mesh of many active missions can't blow the cap.\n // verbose=true restores the full dashboard-grade missions (full goal text, the\n // stats rollup, and full-detail history) — the backward-compatible escape hatch.\n try {\n if (compact) {\n const { live, historyFold } = getMeshStatusMissionsCompact(mesh.id);\n // Bound the live-mission detail by byte budget, newest-active first.\n // Overflow folds into foldedMissions so every live id stays addressable.\n const ranked = [...live].sort((a, b) =>\n String((b as any).tasks?.lastActivityAt ?? '').localeCompare(String((a as any).tasks?.lastActivityAt ?? '')));\n const kept: any[] = [];\n const overflow: any[] = [];\n let spent = 0;\n for (const m of ranked) {\n const cost = JSON.stringify(m).length + 1;\n if (kept.length === 0 || spent + cost <= COMPACT_MISSIONS_BYTE_BUDGET) {\n kept.push(m);\n spent += cost;\n } else {\n overflow.push(m);\n }\n }\n if (kept.length > 0) response.missions = kept;\n if (overflow.length > 0) {\n const byStatus: Record<string, number> = {};\n for (const m of overflow) byStatus[String(m.status)] = (byStatus[String(m.status)] ?? 0) + 1;\n response.foldedMissions = {\n count: overflow.length,\n note: 'Live-mission byte budget reached: these active/paused missions are listed by id only. Use mesh_mission_list or mesh_status verbose=true for their detail.',\n byStatus,\n missionIds: overflow.map(m => String(m.id)),\n };\n }\n if (historyFold) response.missionsHistory = historyFold;\n } else {\n const missions = getMeshStatusMissionSummaries(mesh.id, { verbose: true });\n if (missions.length > 0) {\n response.missions = missions.map(mission => {\n try {\n return { ...mission, stats: computeMeshMissionStats(mesh.id, mission.id) };\n } catch {\n return mission;\n }\n });\n }\n }\n } catch { /* mission read is best-effort */ }\n\n try {\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\n const asyncRefineJobs = buildMeshAsyncRefineJobs({\n meshId: mesh.id,\n ledgerEntries,\n pendingEvents,\n });\n if (asyncRefineJobs.length > 0) {\n if (compact) {\n // Drop terminal (completed/failed) refine jobs — they are historical and\n // dominate the payload. Keep active (non-terminal) job objects so the\n // coordinator can still track in-flight refines, and replace the rest with\n // a status-count summary.\n //\n // Stale terminal jobs (resolved refinery rejections/successes from earlier\n // in the ledger window — often multi-day-old) are folded out of the counts\n // so byStatus.failed reflects *current* breakage, not historical residue.\n // The folded count is surfaced as `staleTerminal` for transparency.\n const summary = summarizeMeshAsyncRefineJobs(asyncRefineJobs);\n if (summary.activeJobs.length > 0) response.asyncRefineJobs = summary.activeJobs;\n response.asyncRefineJobsSummary = {\n total: summary.total,\n byStatus: summary.byStatus,\n ...(summary.staleTerminal > 0 ? { staleTerminal: summary.staleTerminal } : {}),\n };\n } else {\n response.asyncRefineJobs = asyncRefineJobs;\n }\n }\n if (pendingEvents.length > 0) {\n response.pendingCoordinatorEvents = pendingEvents;\n }\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n return JSON.stringify(response, null, 2);\n}\n\nexport async function meshListNodes(ctx: MeshContext): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const { mesh } = ctx;\n return JSON.stringify({\n meshId: mesh.id,\n meshName: mesh.name,\n nodes: mesh.nodes.map(n => ({\n nodeId: n.id,\n workspace: n.workspace,\n repoRoot: n.repoRoot,\n daemonId: readNodeDaemonId(n),\n machineId: readNodeMachineId(n),\n machine: buildNodeMachineIdentity(ctx, n),\n isLocalWorktree: n.isLocalWorktree,\n policy: n.policy,\n relatedRepos: readRelatedRepos(n),\n ...getNodeLaunchReadiness(n),\n ...buildNodeCapabilityExposure(n),\n userOverrides: n.userOverrides,\n })),\n }, null, 2);\n}\n","// Mesh tool implementations — queue domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n ACTIVE_QUEUE_STATUSES,\n COMPACT_MAX_ACTIVE_QUEUE_ROWS,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n HISTORICAL_QUEUE_STATUSES,\n IpcTransport,\n annotateQueueStaleness,\n appendLedgerEntry,\n buildActiveWorkPollingGuidance,\n buildCompactQueueMaintenanceReport,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshNodeCapabilityTags,\n buildQueueMaintenanceReport,\n buildQueueStatusSummary,\n buildQueueTriggerGuidance,\n cancelTask,\n collectMeshViewQueueNodesWithLiveSessions,\n compactActiveWorkRecords,\n compactQueueRow,\n compactQueueRows,\n describeTaskDependencyState,\n enqueueTask,\n filterQueueForView,\n getActiveDirectDispatches,\n getQueue,\n ipcDispatchToRemoteAgent,\n isLocalControlPlaneNode,\n markStaleDirectDispatches,\n meshNodeIdMatches,\n nodeSatisfiesRequiredTags,\n normalizeMeshCapabilityTags,\n normalizeQueueViewMode,\n prioritizeActiveQueueRows,\n readLedgerEntries,\n readString,\n reconcileDirectDispatchesFromTranscriptEvidence,\n recordMeshToolCall,\n refreshMeshFromDaemon,\n requeueTask,\n resolvePreferredWorktreeNodeId,\n sanitizeQueueStatusFilter,\n summarizeTaskMessage,\n triggerMeshQueueAndReport,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n QueueViewMode,\n} from './mesh-tools-internal.js';\n\nexport async function meshEnqueueTask(\n ctx: MeshContext,\n args: {\n message: string; task_mode?: string; taskMode?: string;\n requiredTags?: string[]; required_tags?: string[];\n targetNodeId?: string; target_node_id?: string;\n targetNode?: string; target_node?: string;\n preferWorktree?: boolean; prefer_worktree?: boolean;\n dependsOn?: string[]; depends_on?: string[];\n missionId?: string; mission_id?: string;\n },\n): Promise<string> {\n const taskMode = readString(args.task_mode) || readString(args.taskMode);\n const requiredTags = normalizeMeshCapabilityTags(Array.isArray(args.requiredTags) ? args.requiredTags : args.required_tags);\n const dependsOn = Array.isArray(args.dependsOn) ? args.dependsOn : Array.isArray(args.depends_on) ? args.depends_on : undefined;\n const missionId = readString(args.missionId) || readString(args.mission_id) || undefined;\n // Routing hint: explicit target id wins; otherwise prefer_worktree resolves to the\n // most recently cloned worktree node so isolated work is not preemptively claimed by\n // the first idle base node. Either becomes a targetNodeId, which the node-targeted\n // claim tier honors as a HARD constraint (only that node may claim).\n //\n // MESH-DISPATCH-MISROUTE: accept target_node / targetNode in addition to\n // target_node_id / targetNodeId. A coordinator that passed target_node (the natural\n // name) previously had it silently dropped — the task enqueued UNPINNED and any idle\n // node, including a different machine's base, could claim it (the live cross-machine\n // misroute). Resolving every spelling closes that gap.\n const explicitTargetRaw = readString(args.targetNodeId) || readString(args.target_node_id)\n || readString(args.targetNode) || readString(args.target_node) || undefined;\n const preferWorktree = args.preferWorktree === true || args.prefer_worktree === true;\n\n // MESH-DISPATCH-MISROUTE: a target pin is a hard constraint, so an unresolvable target\n // id must FAIL LOUDLY rather than silently fall through to an unpinned (any-node) task.\n // Canonicalize the supplied id to the live mesh node's own id via the shared identity\n // normalizer (handles id / nodeId / node_id and daemon-id forms) so the downstream raw\n // `node.id === targetNodeId` compares and the claim-tier SQL both match exactly.\n let targetNodeId: string | undefined;\n if (explicitTargetRaw) {\n const matched = ctx.mesh.nodes.find(n => meshNodeIdMatches(n as any, explicitTargetRaw));\n if (!matched) {\n return JSON.stringify({\n success: false,\n code: 'target_node_not_found',\n error: `target node '${explicitTargetRaw}' is not a member of this mesh — refusing to enqueue an unpinned task (it could be claimed by any node, including a different machine). Use mesh_list_nodes to get a valid node id.`,\n targetNodeId: explicitTargetRaw,\n availableNodeIds: ctx.mesh.nodes.map(n => (n as any).id).filter(Boolean),\n });\n }\n targetNodeId = readString((matched as any).id) || explicitTargetRaw;\n } else if (preferWorktree) {\n targetNodeId = resolvePreferredWorktreeNodeId(ctx) || undefined;\n }\n try {\n const task = enqueueTask(ctx.mesh.id, args.message, { taskMode, requiredTags, dependsOn, missionId, targetNodeId, ...(ctx.coordinatorSessionId ? { sourceCoordinatorSessionId: ctx.coordinatorSessionId } : {}) });\n\n // ── LocalTransport: queue-based pull (standalone daemon, all local) ─────\n if (!(ctx.transport instanceof IpcTransport)) {\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n return JSON.stringify({\n success: true,\n source: 'queue',\n taskId: task.id,\n status: task.status,\n taskMode: task.taskMode,\n requiredTags: task.requiredTags,\n ...(targetNodeId ? { targetNodeId } : {}),\n ...(preferWorktree && !explicitTargetRaw && !targetNodeId ? { preferWorktreeNoOp: true } : {}),\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n });\n }\n\n // ── IpcTransport (Cloud Mesh): the queue file lives on THIS machine only.\n // Remote daemons on other machines cannot read the local queue file.\n // Strategy: trigger local queue for local nodes, and for remote nodes\n // directly P2P-dispatch to the first idle session found (enqueue-and-push).\n {\n // 1. Trigger local queue for local node pick-up\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n\n // 2. For each remote node, directly dispatch to an idle session via P2P\n const dispatchPromises: Promise<void>[] = [];\n for (const node of ctx.mesh.nodes) {\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n if (isLocalNode || !node.daemonId) continue;\n // When the task targets a specific node, only that node's daemon\n // should receive the P2P push; others would steal the work.\n if (targetNodeId && node.id !== targetNodeId) continue;\n if (!nodeSatisfiesRequiredTags(requiredTags, buildMeshNodeCapabilityTags(node))) continue;\n\n dispatchPromises.push(\n ipcDispatchToRemoteAgent(ctx, node, { message: args.message })\n .then(result => {\n if (result.success) {\n try {\n const providerType = result.providerType;\n const descriptor = summarizeTaskMessage(args.message);\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'task_dispatched',\n nodeId: node.id,\n sessionId: result.sessionId,\n providerType,\n payload: {\n source: 'queue',\n via: 'p2p_direct',\n taskId: task.id,\n message: args.message,\n taskTitle: descriptor.taskTitle,\n taskSummary: descriptor.taskSummary,\n ...(task.taskMode ? { taskMode: task.taskMode } : {}),\n ...(providerType ? { providerType } : {}),\n targetSessionId: result.sessionId,\n },\n });\n } catch { /* best-effort */ }\n }\n })\n .catch((err: any) => {\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'p2p_dispatch_failed',\n nodeId: node.id,\n payload: {\n source: 'queue',\n via: 'p2p_direct',\n taskId: task.id,\n error: err?.message || String(err),\n dispatchFailedAt: new Date().toISOString(),\n },\n });\n } catch { /* best-effort */ }\n }),\n );\n }\n // Fire-and-forget — don't block the coordinator response\n Promise.all(dispatchPromises).catch(() => {});\n\n return JSON.stringify({\n success: true,\n source: 'queue',\n taskId: task.id,\n status: task.status,\n taskMode: task.taskMode,\n requiredTags: task.requiredTags,\n ...(targetNodeId ? { targetNodeId } : {}),\n ...(preferWorktree && !explicitTargetRaw && !targetNodeId ? { preferWorktreeNoOp: true } : {}),\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n });\n }\n } catch (e: any) {\n const message = e?.message || String(e);\n if (message.includes('live_debug_readonly_guardrail_violation')) {\n return JSON.stringify({ success: false, code: 'live_debug_readonly_guardrail_violation', taskMode, error: message });\n }\n if (message.includes('dependency_cycle_detected')) {\n return JSON.stringify({ success: false, code: 'dependency_cycle_detected', dependsOn, error: message });\n }\n return JSON.stringify({ success: false, error: message });\n }\n}\n\nexport async function meshViewQueue(\n ctx: MeshContext,\n args: { status?: string[]; view?: QueueViewMode; compact?: boolean; verbose?: boolean },\n): Promise<string> {\n const rateResult = recordMeshToolCall({ meshId: ctx.mesh.id, tool: 'mesh_view_queue' });\n // Default to the slim payload for LLM callers; verbose forces the full payload.\n const compact = args.verbose === true ? false : (args.compact ?? true);\n try {\n await refreshMeshFromDaemon(ctx);\n const statusFilter = sanitizeQueueStatusFilter(args.status);\n const view = normalizeQueueViewMode(args.view);\n const rawQueue = getQueue(ctx.mesh.id);\n // M1: annotate dependency state (waitingOn, dependenciesSatisfied) at view time.\n const statusById = new Map(rawQueue.map(task => [task.id, task.status]));\n const withDependencies = rawQueue.map(task => {\n if (!Array.isArray(task.dependsOn) || task.dependsOn.length === 0) return task;\n const depState = describeTaskDependencyState(task, statusById);\n return { ...task, ...depState };\n });\n const fullQueue = prioritizeActiveQueueRows(annotateQueueStaleness(withDependencies, ctx.mesh));\n const queue = filterQueueForView(fullQueue, view, statusFilter);\n const summary = buildQueueStatusSummary(fullQueue);\n const visibleSummary = buildQueueStatusSummary(queue);\n const maintenance = buildQueueMaintenanceReport(fullQueue);\n const liveNodes = await collectMeshViewQueueNodesWithLiveSessions(ctx);\n let ledgerEntries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n let directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n const directReconciliation = await reconcileDirectDispatchesFromTranscriptEvidence(ctx, liveNodes, directDispatches, ledgerEntries);\n if (directReconciliation.reconciled > 0) {\n ledgerEntries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n }\n // Mark dispatched entries with no session activity after 30 min as stale.\n markStaleDirectDispatches(ctx.mesh.id);\n directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n const activeWorkEvidence = buildMeshActiveWork({\n meshId: ctx.mesh.id,\n queue: fullQueue,\n ledgerEntries,\n // Always pass MeshRuntimeStore records (may be empty). buildMeshActiveWork uses them for local\n // dispatches and falls through to ledger scan for remote P2P dispatches not in MeshRuntimeStore.\n directDispatches,\n nodes: liveNodes,\n });\n const recentDispatchFailures = ledgerEntries\n .filter(e => e.kind === 'p2p_dispatch_failed')\n .slice(-20)\n .map(e => ({\n nodeId: e.nodeId,\n taskId: e.payload?.taskId,\n error: e.payload?.error,\n via: e.payload?.via,\n failedAt: e.payload?.dispatchFailedAt || e.timestamp,\n }));\n const staleAssignedTasks = (maintenance as any).staleAssignedTasks || [];\n const requestedHistoricalRows = queue.some((task: any) => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n const pollingGuidance = buildActiveWorkPollingGuidance(activeWorkEvidence.summary);\n\n // Compact mode: completed/failed/cancelled historical row arrays are the main\n // payload bloat (mesh_view_queue has overflowed 250k chars on busy meshes).\n // Drop them in favor of the status counts that summary/visibleSummary already\n // carry, but keep pending/assigned active rows — those drive coordinator\n // dispatch decisions. verbose=true returns every row as before.\n const activeOnlyQueue = queue.filter((task: any) => !HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n // Compact mode: cap active rows and truncate per-row messages (a busy mesh\n // can carry dozens of multi-KB task messages → 70KB+ in the active array).\n const compactQueueResult = compact ? compactQueueRows(activeOnlyQueue) : { rows: activeOnlyQueue, omitted: 0 };\n const visibleQueue = compact ? compactQueueResult.rows : queue;\n const wantActiveQueueArray = view === 'active' || statusFilter?.some(status => ACTIVE_QUEUE_STATUSES.has(status));\n const wantHistoricalQueueArray = !compact && (view === 'historical' || requestedHistoricalRows);\n // activeWork carries the full task message/summary per record — the single\n // largest payload source on a busy mesh. Slim + cap it in compact mode.\n const activeWorkResult = compact\n ? compactActiveWorkRecords(activeWorkEvidence.activeWork)\n : { records: activeWorkEvidence.activeWork, omitted: 0 };\n\n // staleDirectWork is a full MeshActiveWorkRecord[] of orphaned/historical\n // direct dispatches — it is the second major payload-bloat source (the first\n // being historical queue rows). In compact mode, collapse it to the same\n // bounded summary mesh_status uses and only emit the full array in verbose mode.\n const staleDirectWorkSummary = buildCompactStaleDirectWorkSummary(activeWorkEvidence.staleDirectWork, {\n note: activeWorkEvidence.staleDirectWorkNote,\n detailHint: 'Full stale direct entries are omitted from mesh_view_queue in compact mode. Call mesh_view_queue with verbose=true, or inspect mesh_task_history for ledger detail.',\n });\n // queueMaintenance/cleanupDryRun serialize the same maintenance object whose\n // cleanupCandidates array scales with old historical record count. In compact\n // mode drop the per-row arrays in favor of counts.\n const maintenanceForResponse = compact ? buildCompactQueueMaintenanceReport(maintenance) : maintenance;\n\n return JSON.stringify({\n success: true,\n payloadMode: compact ? 'compact' : 'full',\n sourceOfTruth: {\n kind: 'mesh_work_queue_file',\n activeStatuses: ['pending', 'assigned'],\n historicalStatuses: ['completed', 'failed', 'cancelled'],\n notes: 'pending/assigned are active work; completed/failed/cancelled are historical ledger records and never stale assignments.',\n },\n filter: {\n view,\n statuses: statusFilter,\n filtered: Boolean(statusFilter?.length) || view !== 'all',\n },\n queue: visibleQueue,\n ...(compact ? { historicalRowsOmitted: true, historicalRowsHint: 'Completed/failed/cancelled rows are omitted in compact mode; see historicalCounts. Call mesh_view_queue with verbose=true (or view=historical, compact=false) for full rows.' } : {}),\n ...(compact && compactQueueResult.omitted > 0 ? {\n activeRowsOmitted: compactQueueResult.omitted,\n activeRowsHint: `Showing the first ${COMPACT_MAX_ACTIVE_QUEUE_ROWS} active rows (per-row messages truncated). ${compactQueueResult.omitted} more active row(s) omitted — see activeCount/activeCounts for the complete total or use verbose=true.`,\n } : {}),\n activeWork: activeWorkResult.records,\n ...(compact && activeWorkResult.omitted > 0 ? {\n activeWorkOmitted: activeWorkResult.omitted,\n activeWorkHint: `Showing the first ${COMPACT_MAX_ACTIVE_WORK_ROWS} active-work records (messages truncated). ${activeWorkResult.omitted} more omitted — see activeWorkSummary for complete counts or use verbose=true.`,\n } : {}),\n staleDirectWorkSummary,\n ...(compact ? {} : { staleDirectWork: activeWorkEvidence.staleDirectWork }),\n activeWorkSummary: activeWorkEvidence.summary,\n ...(pollingGuidance ? { pollingGuidance } : {}),\n ...(rateResult.rateLimitExceeded ? { pollingRateAdvisory: { type: 'rate_limit_exceeded', tool: 'mesh_view_queue', callsInWindow: rateResult.callsInWindow, message: rateResult.advisory } } : {}),\n summary,\n visibleSummary,\n activeCounts: summary.activeCounts,\n historicalCounts: summary.historicalCounts,\n visibleActiveCounts: visibleSummary.activeCounts,\n visibleHistoricalCounts: visibleSummary.historicalCounts,\n activeCount: summary.activeCount,\n historicalCount: summary.historicalCount,\n visibleActiveCount: visibleSummary.activeCount,\n visibleHistoricalCount: visibleSummary.historicalCount,\n staleAssignedTasks: compact ? staleAssignedTasks.slice(0, 10).map(compactQueueRow) : staleAssignedTasks,\n staleAssignedCount: (maintenance as any).staleAssignedCount,\n queueMaintenance: maintenanceForResponse,\n cleanupDryRun: maintenanceForResponse,\n ...(recentDispatchFailures.length > 0 ? {\n recentDispatchFailures,\n dispatchFailureCount: recentDispatchFailures.length,\n dispatchFailureNote: 'Remote P2P dispatch attempts that failed. Affected tasks remain pending and may require mesh_queue_requeue if no idle session picks them up.',\n } : {}),\n ...(wantActiveQueueArray && !compact ? {\n activeQueue: queue.filter((task: any) => ACTIVE_QUEUE_STATUSES.has(String(task?.status || ''))),\n } : {}),\n // In compact mode the `queue` field already holds exactly the slimmed+\n // capped active rows, so the separate activeQueue array would be a verbatim\n // duplicate (it doubled the payload). Point callers at `queue` instead.\n ...(wantActiveQueueArray && compact ? { activeQueueHint: 'In compact mode the active rows are in `queue` (already filtered to pending/assigned). Use verbose=true for the separate full activeQueue array.' } : {}),\n ...(wantHistoricalQueueArray ? {\n historicalQueue: queue.filter((task: any) => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || ''))),\n } : {}),\n // Back-compat alias for callers already reading the first hardening payload.\n staleAssignments: compact ? staleAssignedTasks.slice(0, 10).map(compactQueueRow) : staleAssignedTasks,\n }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n}\n\nexport async function meshQueueCancel(\n ctx: MeshContext,\n args: { task_id?: string; taskId?: string; reason?: string },\n): Promise<string> {\n try {\n const taskId = (args.task_id || args.taskId || '').trim();\n if (!taskId) return JSON.stringify({ success: false, error: 'task_id required' });\n\n // MESH-DISPATCH-MISROUTE: read the PRE-cancel entry so we know whether the task was\n // already dispatched to a live worker. cancelTask overwrites status to 'cancelled'\n // but preserves assignedSessionId/Node/Provider, so the assignment fields survive —\n // only the status must be captured before the mutation.\n const preCancel = getQueue(ctx.mesh.id).find((t: any) => t?.id === taskId) as {\n status?: string; assignedSessionId?: string; assignedNodeId?: string; assignedProviderType?: string;\n } | undefined;\n const wasAssigned = preCancel?.status === 'assigned';\n const assignedSessionId = readString(preCancel?.assignedSessionId) || undefined;\n const assignedNodeId = readString(preCancel?.assignedNodeId) || undefined;\n const assignedProviderType = readString(preCancel?.assignedProviderType) || undefined;\n\n const task = cancelTask(ctx.mesh.id, taskId, { reason: args.reason });\n if (!task) return JSON.stringify({ success: false, error: `Queue task '${taskId}' not found` });\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n\n // MESH-DISPATCH-MISROUTE (fix 2): cancelling the queue row alone does NOT stop a worker\n // that already claimed the task and is generating — it ran to completion and committed\n // to the (often base) checkout. When the task was dispatched to a live session, propagate\n // a stop so the worker halts its in-flight generation. Guards:\n // - only for an 'assigned' task with a resolvable assignedSessionId (a pending/terminal\n // task has no live worker to stop — sending one would be a no-op at best);\n // - NEVER stop the coordinator's own session (ctx.coordinatorSessionId) — that is the\n // session issuing the cancel, not the worker. Stopping it would kill the coordinator.\n // The stop rides agent_command(action:'stop'), which is already in the router's\n // MESH_FORWARDABLE_SESSION_COMMANDS set: a session hosted on a REMOTE worker daemon is\n // auto-forwarded to that daemon (cross-machine workers are reached), and meshContext.nodeId\n // keeps the fail-closed cross-node scoping AND now seeds the router's deterministic\n // owner-resolution fallback (assignedNodeId → owner daemon) so a worktree-clone worker\n // whose session id missed the coordinator's cached active-sessions snapshot is still reached.\n // CANCEL-STOP false-positive fix: AWAIT the stop and report its REAL outcome\n // (stopped / no response from remote worker daemon / \"CLI agent not running\") instead of\n // pre-stamping attempted:true on a fire-and-forget call. Best-effort: any stop failure is\n // caught and surfaced in workerStop.reason — it must NEVER fail the cancel itself, which\n // already committed the queue 'cancelled' transition above.\n let workerStop: { attempted: boolean; stopped?: boolean; sessionId?: string; nodeId?: string; reason?: string } = { attempted: false };\n if (wasAssigned && assignedSessionId && assignedSessionId !== ctx.coordinatorSessionId && assignedProviderType) {\n workerStop = { attempted: true, sessionId: assignedSessionId, nodeId: assignedNodeId };\n try {\n const stopResult = await ctx.transport.command('agent_command', {\n targetSessionId: assignedSessionId,\n cliType: assignedProviderType,\n agentType: assignedProviderType,\n action: 'stop',\n ...(assignedNodeId ? { meshContext: { meshId: ctx.mesh.id, nodeId: assignedNodeId, taskId } } : {}),\n });\n const stopped = stopResult?.stopped === true || stopResult?.success === true;\n workerStop.stopped = stopped;\n if (!stopped) {\n workerStop.reason = readString(stopResult?.error) || 'worker stop not confirmed';\n }\n } catch (e: any) {\n workerStop.stopped = false;\n workerStop.reason = e?.message || String(e);\n }\n } else if (wasAssigned && assignedSessionId === ctx.coordinatorSessionId) {\n workerStop = { attempted: false, reason: 'assigned_session_is_coordinator_self — stop suppressed' };\n }\n\n return JSON.stringify({ success: true, task, workerStop }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n}\n\nexport async function meshQueueRequeue(\n ctx: MeshContext,\n args: {\n task_id?: string;\n taskId?: string;\n reason?: string;\n target_node_id?: string;\n targetNodeId?: string;\n target_session_id?: string;\n targetSessionId?: string;\n clear_target_node?: boolean;\n clearTargetNode?: boolean;\n keep_target_session?: boolean;\n keepTargetSession?: boolean;\n force?: boolean;\n },\n): Promise<string> {\n try {\n const taskId = (args.task_id || args.taskId || '').trim();\n if (!taskId) return JSON.stringify({ success: false, error: 'task_id required' });\n const targetNodeId = (args.target_node_id || args.targetNodeId || '').trim() || undefined;\n const targetSessionId = (args.target_session_id || args.targetSessionId || '').trim() || undefined;\n const keepTargetSession = args.keep_target_session === true || args.keepTargetSession === true;\n const task = requeueTask(ctx.mesh.id, taskId, {\n reason: args.reason,\n targetNodeId,\n targetSessionId,\n clearTargetNode: args.clear_target_node === true || args.clearTargetNode === true,\n clearTargetSession: targetSessionId ? false : !keepTargetSession,\n force: args.force === true,\n });\n if (!task) return JSON.stringify({ success: false, error: `Queue task '${taskId}' not found` });\n if (task.status === 'failed' && task.cancelReason?.startsWith('max_retries_exceeded')) {\n return JSON.stringify({\n success: false,\n code: 'max_retries_exceeded',\n error: task.cancelReason,\n task,\n hint: 'Use force=true to bypass the retry cap for explicit operator recovery.',\n }, null, 2);\n }\n // Pass the task's target node as preferredNodeId so the trigger claims the\n // requeued task on the intended node's idle session FIRST (router.ts\n // preferred-node tier) before the general round-robin picks a different node.\n // Honours an explicit requeue target_node_id over the persisted one.\n const triggerPreferredNodeId = targetNodeId || task.targetNodeId || undefined;\n ctx.transport.command('trigger_mesh_queue', {\n meshId: ctx.mesh.id,\n ...(triggerPreferredNodeId ? { preferredNodeId: triggerPreferredNodeId } : {}),\n }).catch(() => {});\n return JSON.stringify({ success: true, task }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n}\n","// Mesh tool implementations — mission domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n MESH_MISSION_STATUSES,\n appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n commandForNode,\n computeMeshMissionStats,\n computeMeshTaskStats,\n drainCoordinatorPendingEvents,\n getLedgerSummary,\n isLocalControlPlaneNode,\n listMeshMissionSummaries,\n readLedgerEntries,\n readLedgerSlice,\n readLedgerSliceFromStore,\n readString,\n refreshMeshFromDaemon,\n slimLedgerPayload,\n unwrapCommandPayload,\n upsertMeshMission,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\nexport async function meshTaskHistory(\n ctx: MeshContext,\n args: { tail?: number; kind?: string; compact?: boolean; verbose?: boolean },\n): Promise<string> {\n const { mesh } = ctx;\n // Default to the slim payload for LLM callers; verbose forces full payloads.\n const compact = args.verbose === true ? false : (args.compact ?? true);\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\n // Clamp tail so a large default/explicit value can't blow up the payload in\n // compact mode. Full (verbose) callers may request a deeper window.\n const requestedTail = typeof args.tail === 'number' && args.tail > 0 ? Math.floor(args.tail) : 20;\n // Compact: cap conservatively so even large refine-batch entries can't blow the\n // token limit. slimLedgerPayload is the primary defense (it summarizes large\n // plan/validationPlan/suggestedConfig fields); this clamp is the backstop. A deep\n // explicit request (tail > 50) is clamped harder (20) than a modest one (30).\n const compactCap = requestedTail > 50 ? 20 : 30;\n const tail = compact ? Math.min(requestedTail, compactCap) : Math.min(requestedTail, 200);\n const kind = typeof args.kind === 'string' && args.kind.trim() ? [args.kind.trim() as any] : undefined;\n const rawEntries = readLedgerEntries(mesh.id, { tail, kind });\n // Slim large payload fields so coordinator context stays lean. Verbose\n // returns the raw payloads untouched for full audit detail.\n const entries = compact\n ? rawEntries.map(e => ({\n ...e,\n payload: e.payload ? slimLedgerPayload(e.payload) : e.payload,\n }))\n : rawEntries;\n const summary = getLedgerSummary(mesh.id);\n // M7: per-task time/attempt stats for tasks visible in the returned window.\n // Derived from ledger truth at query time; incomplete evidence is flagged,\n // never estimated.\n let taskStats: unknown[] | undefined;\n try {\n const taskIds = [...new Set(rawEntries\n .map(e => (typeof e.payload?.taskId === 'string' ? e.payload.taskId : ''))\n .filter(Boolean))] as string[];\n if (taskIds.length > 0) {\n const stats = computeMeshTaskStats(mesh.id, { taskIds });\n if (stats.length > 0) taskStats = stats;\n }\n } catch { /* stats are best-effort */ }\n return JSON.stringify({\n meshId: mesh.id,\n payloadMode: compact ? 'compact' : 'full',\n entries,\n summary,\n ...(taskStats ? { taskStats } : {}),\n ...(pendingEvents.length > 0 ? { pendingCoordinatorEvents: pendingEvents } : {}),\n }, null, 2);\n}\n\nexport async function meshRecordNote(\n ctx: MeshContext,\n args: { text?: string; category?: string },\n): Promise<string> {\n const { mesh } = ctx;\n const text = typeof args.text === 'string' ? args.text.trim() : '';\n if (!text) {\n return JSON.stringify({ success: false, error: 'text required' }, null, 2);\n }\n const category = args.category === 'provider_quirk' || args.category === 'pattern_to_avoid' || args.category === 'recovery_lesson'\n ? args.category\n : undefined;\n const createdAt = new Date().toISOString();\n // sourceCoordinator: best-effort identity of the recording coordinator so a\n // future coordinator can attribute the note. Session id is the most precise;\n // fall back to the daemon/hostname.\n const sourceCoordinator = ctx.coordinatorSessionId || ctx.localDaemonId || ctx.coordinatorHostname || undefined;\n const entry = appendLedgerEntry(mesh.id, {\n kind: 'coordinator_operating_note',\n ...(sourceCoordinator ? { sessionId: sourceCoordinator } : {}),\n payload: {\n text,\n ...(category ? { category } : {}),\n createdAt,\n ...(sourceCoordinator ? { sourceCoordinator } : {}),\n },\n });\n return JSON.stringify({\n success: true,\n meshId: mesh.id,\n noteId: entry.id,\n recorded: { text, category: category ?? null, createdAt },\n note: 'Recorded to the mesh ledger. Future coordinators on this mesh will see it under \"## Operating Notes\" at launch.',\n }, null, 2);\n}\n\nexport async function meshReconcileLedger(\n ctx: MeshContext,\n args: { node_ids?: string[]; limit?: number; after_id?: string; since?: string; import_entries?: boolean },\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const requestedNodeIds = Array.isArray(args.node_ids)\n ? new Set(args.node_ids.map(id => typeof id === 'string' ? id.trim() : '').filter(Boolean))\n : null;\n const nodes = ctx.mesh.nodes.filter(node => !requestedNodeIds || requestedNodeIds.has(node.id));\n const replicas: any[] = [];\n const shouldImport = args.import_entries !== false;\n const queryArgs = {\n meshId: ctx.mesh.id,\n ...(typeof args.limit === 'number' ? { limit: args.limit } : {}),\n ...(typeof args.after_id === 'string' && args.after_id.trim() ? { afterId: args.after_id.trim() } : {}),\n ...(typeof args.since === 'string' && args.since.trim() ? { since: args.since.trim() } : {}),\n };\n\n for (const node of nodes) {\n try {\n if (isLocalControlPlaneNode(ctx, node) || !node.daemonId) {\n // G4: Use SQLite mesh_event_ledger (bounded slice) as the local P2P reconcile read path.\n // readLedgerSlice (JSONL) is retained for per-daemon P2P export; coordinator local reads use SQLite.\n const slice = readLedgerSliceFromStore(ctx.mesh.id, queryArgs);\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'local',\n slice,\n status: 'local',\n }));\n continue;\n }\n\n const result = await commandForNode(ctx, node, 'get_mesh_ledger_slice', queryArgs);\n const payload = unwrapCommandPayload(result);\n if (payload?.success === false) {\n throw new Error(payload.error || 'remote get_mesh_ledger_slice failed');\n }\n const slice = payload?.slice ?? payload;\n if (slice?.protocol !== 'adhdev.mesh.ledger.slice.v1' || !Array.isArray(slice.entries)) {\n throw new Error('remote daemon returned an invalid ledger slice payload');\n }\n const importResult = shouldImport\n ? appendRemoteLedgerEntries(ctx.mesh.id, slice.entries)\n : { accepted: 0, skippedDuplicate: 0, rejectedInvalid: 0, entries: [] };\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'p2p_datachannel',\n slice,\n importResult,\n }));\n if (shouldImport && importResult.accepted > 0) {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_replicated',\n nodeId: node.id,\n payload: {\n protocol: 'adhdev.mesh.ledger.slice.v1',\n imported: importResult.accepted,\n skippedDuplicate: importResult.skippedDuplicate,\n rejectedInvalid: importResult.rejectedInvalid,\n nextAfterId: slice.cursor?.nextAfterId ?? null,\n via: 'p2p_datachannel',\n },\n });\n }\n } catch (e: any) {\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: node.daemonId ? 'p2p_datachannel' : 'local',\n status: 'failed',\n error: e?.message ?? String(e),\n }));\n }\n }\n\n const evidence = buildMeshLedgerReconciliationEvidence(ctx.mesh.id, replicas);\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_reconciled',\n payload: {\n protocol: evidence.protocol,\n sourceOfTruth: evidence.sourceOfTruth,\n totals: evidence.totals,\n convergence: evidence.convergence,\n },\n });\n return JSON.stringify({ success: true, evidence }, null, 2);\n}\n\nexport async function meshMissionUpsert(\n ctx: MeshContext,\n args: { mission_id?: string; missionId?: string; title: string; goal?: string; status?: string },\n): Promise<string> {\n try {\n const mission = upsertMeshMission(ctx.mesh.id, {\n id: readString(args.mission_id) || readString(args.missionId) || undefined,\n title: args.title,\n goal: typeof args.goal === 'string' ? args.goal : undefined,\n status: readString(args.status) || undefined,\n });\n return JSON.stringify({\n success: true,\n mission,\n nextAction: 'Attach tasks with mesh_enqueue_task mission_id and depends_on. mesh_status shows live task aggregates for this mission.',\n });\n } catch (e: any) {\n const message = e?.message || String(e);\n const code = message.includes('mission_title_required') ? 'mission_title_required'\n : message.includes('invalid_mission_status') ? 'invalid_mission_status'\n : undefined;\n return JSON.stringify({ success: false, ...(code ? { code } : {}), error: message });\n }\n}\n\nexport async function meshMissionList(\n ctx: MeshContext,\n args: { status?: string | string[]; verbose?: boolean } = {},\n): Promise<string> {\n try {\n const rawStatuses = Array.isArray(args.status)\n ? args.status\n : typeof args.status === 'string' && args.status.trim()\n ? [args.status]\n : [];\n const invalid = rawStatuses.filter(s => !MESH_MISSION_STATUSES.includes(s as any));\n if (invalid.length > 0) {\n return JSON.stringify({\n success: false,\n code: 'invalid_mission_status',\n error: `invalid status filter: ${invalid.join(', ')} (valid: ${MESH_MISSION_STATUSES.join(', ')})`,\n });\n }\n const statuses = rawStatuses.length > 0 ? (rawStatuses as any[]) : undefined;\n const missions = listMeshMissionSummaries(ctx.mesh.id, {\n statuses,\n verbose: args.verbose === true,\n }).map(mission => {\n try {\n return { ...mission, stats: computeMeshMissionStats(ctx.mesh.id, mission.id) };\n } catch {\n return mission;\n }\n });\n return JSON.stringify({\n success: true,\n count: missions.length,\n ...(statuses ? { statusFilter: statuses } : {}),\n missions,\n }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e?.message || String(e) });\n }\n}\n\nexport async function meshReviewInbox(\n ctx: MeshContext,\n args: { mesh_id?: string } = {},\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const meshId = (args.mesh_id ?? ctx.mesh.id).trim();\n const result = await commandForNode(ctx, ctx.mesh.nodes[0], 'get_mesh_review_inbox', {\n meshId,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n","// Mesh tool implementations — session domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n IpcTransport,\n SESSION_PROVIDER_METADATA_TTL_MS,\n annotateRapidReadChatAdvisory,\n appendLedgerEntry,\n buildCoordinatorP2pRelayFailure,\n buildDirectTaskPayload,\n buildMeshActiveWork,\n buildMeshReadChatCacheFallback,\n buildMissingCoordinatorDaemonIdFailure,\n buildMissingNodeReadChatRecovery,\n buildQueueTriggerGuidance,\n collectLiveStatusProbe,\n collectMeshViewQueueNodesWithLiveSessions,\n commandForNode,\n compactChatPayload,\n drainCoordinatorPendingEvents,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n extractLaunchPayload,\n extractStatusMetadataSessions,\n findNodeWithRefresh,\n findOptionalNodeWithRefresh,\n getActiveDirectDispatches,\n getQueue,\n getSessionMetadata,\n getWorktreeBootstrapLaunchBlock,\n hasRecentDuplicateDispatch,\n insertDirectDispatch,\n ipcDispatchToRemoteAgent,\n isIdleSessionRecord,\n isLocalControlPlaneNode,\n isMeshCoordinatorSessionRecord,\n isMeshOwnedDelegateSession,\n isP2pRelayTransportFailure,\n isTerminalSessionRecord,\n isUnmanagedSessionRecord,\n isWorkerTaskMode,\n meshSessionCacheKey,\n meshSessionProviderMetadata,\n missingProviderPriorityMessage,\n pruneStaleDirectDispatches,\n randomUUID,\n readLedgerEntries,\n readProviderPriority,\n readSessionRecordId,\n readSpawnedSessionVisibility,\n readString,\n recordDirectDispatchTask,\n recordRecoverableLaunchFailure,\n refreshMeshFromDaemon,\n resolveCoordinatorDaemonId,\n resolveCoordinatorNode,\n resolveDelegatedWorkerAutoApprove,\n resolveMeshSessionProviderMetadata,\n resolveSessionProviderType,\n triggerMeshQueueAndReport,\n unwrapCommandPayload,\n validateMeshTaskModeRequest,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\n\n/**\n * Prune orphaned staleDirect dispatch records — direct dispatches whose original node/session is\n * no longer present in the live mesh (or terminal). dry_run (default) reports exactly which\n * taskIds would be pruned without mutating anything; pass execute=true to actually remove them.\n *\n * Safety:\n * - Only records classified as staleDirectWork by buildMeshActiveWork against the CURRENT live\n * mesh are eligible — active/pending/assigned/generating work is never in that set.\n * - Of those, only orphans (node/session gone) are pruned. Fresh unacknowledged dispatch\n * failures (staleDispatchUnacknowledged: node/session still live) are explicitly preserved and\n * reported under preservedUnacknowledged so the caller can recover them.\n * - Pruning deletes only the mesh_direct_dispatches store rows; the append-only mesh ledger\n * (audit history) is left intact, and a direct_dispatch_pruned ledger entry is appended on\n * execute so the prune itself is auditable.\n */\nexport async function meshPruneStaleDirect(\n ctx: MeshContext,\n args: { execute?: boolean; dry_run?: boolean; include_terminal?: boolean } = {},\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n // execute must be explicit; dry_run is the default unless execute===true.\n const execute = args.execute === true && args.dry_run !== true;\n const includeTerminal = args.include_terminal === true;\n\n const liveNodes = await collectMeshViewQueueNodesWithLiveSessions(ctx);\n const ledgerEntries = readLedgerEntries(ctx.mesh.id, { tail: 500 });\n const directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n\n // Manual prune is immediate (minAgeMs omitted → 0). The same prune core powers the daemon\n // reconcile-loop auto-prune, which passes a conservative age gate. Keeping a single core\n // means the safety classification + audit-ledger behavior can never drift between the two.\n const result = pruneStaleDirectDispatches({\n meshId: ctx.mesh.id,\n queue: getQueue(ctx.mesh.id),\n ledgerEntries,\n directDispatches,\n nodes: liveNodes,\n execute,\n includeTerminal,\n source: 'mesh_prune_stale_direct',\n });\n\n const { prunable, prunedCount, preservedUnacknowledged, preservedLedgerOnly, preservedNotOrphan } = result;\n\n const summarize = (records: typeof prunable) => records.map(r => ({\n taskId: r.taskId,\n nodeId: r.nodeId,\n sessionId: r.sessionId,\n status: r.status,\n terminal: r.terminal === true,\n staleReason: r.staleReason,\n taskTitle: r.taskTitle,\n createdAt: r.createdAt,\n }));\n\n return JSON.stringify({\n success: true,\n mode: result.mode,\n meshId: ctx.mesh.id,\n includeTerminal,\n candidateCount: result.candidateCount,\n prunableCount: prunable.length,\n prunedCount,\n prunable: summarize(prunable),\n preserved: {\n unacknowledgedCount: preservedUnacknowledged.length,\n ledgerOnlyCount: preservedLedgerOnly.length,\n notOrphanCount: preservedNotOrphan.length,\n unacknowledged: summarize(preservedUnacknowledged),\n ledgerOnly: summarize(preservedLedgerOnly),\n notOrphan: summarize(preservedNotOrphan),\n },\n note: execute\n ? `Pruned ${prunedCount} orphaned direct dispatch record(s) from the active staleDirect surface. The append-only mesh ledger audit history is preserved; a direct_dispatch_pruned entry records this prune.`\n : 'Dry run — nothing was deleted. Re-run with execute=true to prune the listed orphaned records. Fresh unacknowledged dispatch failures (node/session still live) and ledger-only audit entries are always preserved.',\n }, null, 2);\n}\n\nexport async function meshSendTask(\n ctx: MeshContext,\n args: {\n node_id: string; session_id?: string; message: string;\n task_mode?: string; taskMode?: string;\n mission_id?: string; missionId?: string;\n },\n): Promise<string> {\n const requestedTaskMode = readString(args.task_mode) || readString(args.taskMode);\n // Optional mission attribution. When set, the direct-dispatched task is also\n // materialised as an assigned queue entry so it counts toward the mission's\n // task aggregates — see recordDirectDispatchTask. Absent → unattributed\n // direct dispatch as before (backward compatible).\n const missionId = readString(args.missionId) || readString(args.mission_id) || undefined;\n const modeValidation = validateMeshTaskModeRequest(requestedTaskMode, args.message);\n if (!modeValidation.valid) {\n return JSON.stringify({\n success: false,\n code: 'live_debug_readonly_guardrail_violation',\n taskMode: modeValidation.taskMode || requestedTaskMode,\n violations: modeValidation.violations,\n allowedOperations: modeValidation.allowedOperations,\n error: `live_debug_readonly_guardrail_violation: forbidden operations (${modeValidation.violations.join(', ')})`,\n });\n }\n const taskMode = modeValidation.taskMode;\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n // Policy check: read-only node cannot receive tasks\n if (node.policy?.readOnly) {\n return JSON.stringify({ error: `Node '${args.node_id}' is read-only` });\n }\n\n // WTDISPATCH-FANOUT: a `convergence` task lands its work onto base (merge → push →\n // cleanup) and is base-only. Refuse a direct dispatch that targets a worktree-clone\n // node, fail-closed — co-located sibling worktree sessions racing a convergence\n // push/production-deploy is exactly the 4-way fan-out the live repro hit. Mirrors the\n // queue claim guard (claimNextQueueTask) and the auto-launch eligibility filter so the\n // base-only invariant holds across every dispatch entry point.\n if (taskMode === 'convergence' && node.isLocalWorktree === true) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_convergence_target_is_worktree',\n reason: 'mesh_convergence_target_is_worktree',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode,\n error: `Node '${args.node_id}' is a worktree clone; a convergence task is base-only (it merges/pushes onto base). Dispatching it to a worktree session risks a multi-worktree push/deploy race.`,\n nextAction: `Dispatch the convergence task to the base node for this mesh, or run the deterministic fast-forward convergence path (mesh_fast_forward_node / mesh_refine_node) instead of mesh_send_task.`,\n });\n }\n\n let explicitTargetSession: any | undefined;\n if (args.session_id && isWorkerTaskMode(taskMode)) {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n explicitTargetSession = sessions.find(session => readSessionRecordId(session) === args.session_id);\n if (explicitTargetSession && isMeshCoordinatorSessionRecord(explicitTargetSession)) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_is_coordinator',\n reason: 'mesh_target_session_is_coordinator',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n error: `Session '${args.session_id}' is a Repo Mesh coordinator session, not a visible worker session. Launch or use a visible worker session before dispatching this task.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' and then retry mesh_send_task with that worker session_id, or use mesh_enqueue_task for queue-based worker assignment.`,\n });\n }\n if (explicitTargetSession && isUnmanagedSessionRecord(explicitTargetSession)) {\n // Session exists but lacks mesh delegation metadata (no meshNodeFor,\n // meshCoordinatorFor, or launchedByCoordinator). It could be:\n // - The coordinator's own session → self-send risk\n // - A manually launched session not associated with this mesh\n // Completion events from this session would not reach the coordinator\n // ledger. Surface a hard warning but still record the dispatch attempt\n // in the result so the coordinator can decide whether to proceed.\n //\n // Note: if the session happens to have meshCoordinatorFor set, the check\n // above would have already returned mesh_target_session_is_coordinator.\n // This warning fires only for truly unmanaged sessions.\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_unmanaged',\n reason: 'mesh_target_session_unmanaged',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n unsafeTranscriptAlias: true,\n error: `Session '${args.session_id}' on node '${args.node_id}' has no Repo Mesh delegation metadata (missing meshNodeFor/meshCoordinatorFor/launchedByCoordinator). It may be the coordinator's own session or an unrelated session — dispatching risks self-send and orphaned completion events that never reach the coordinator ledger.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' to start a fresh managed worker session, then retry mesh_send_task with the returned session_id. Alternatively use mesh_enqueue_task for queue-based assignment without specifying session_id.`,\n });\n }\n } catch {\n explicitTargetSession = undefined;\n }\n }\n\n // Avoid duplicate side effects when an MCP/tool call is interrupted after\n // the daemon already accepted the send and the coordinator retries the\n // exact same node/session/message immediately.\n const duplicate = hasRecentDuplicateDispatch(ctx, args);\n if (duplicate.duplicate) {\n return JSON.stringify({\n success: true,\n duplicate: true,\n dispatched: false,\n warning: 'Duplicate mesh_send_task suppressed: the same node/session/message was dispatched recently.',\n nodeId: args.node_id,\n sessionId: args.session_id,\n source: duplicate.source,\n previousDispatch: duplicate.entry ? {\n id: duplicate.entry.id,\n timestamp: duplicate.entry.timestamp || duplicate.entry.updatedAt || duplicate.entry.createdAt,\n nodeId: duplicate.entry.nodeId || duplicate.entry.targetNodeId || duplicate.entry.assignedNodeId,\n sessionId: duplicate.entry.sessionId || duplicate.entry.targetSessionId || duplicate.entry.assignedSessionId,\n } : undefined,\n });\n }\n\n try {\n // ── IpcTransport + remote node: direct P2P agent_command dispatch ──────\n //\n // The local queue file (mesh-ledger/*.queue.json) is stored on THIS\n // machine and is inaccessible to the remote daemon. Sending\n // trigger_mesh_queue to the remote daemon would always be a no-op\n // because it cannot read the queue. Instead we relay agent_command\n // directly over P2P so the remote daemon forwards it to its agent.\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n if (ctx.transport instanceof IpcTransport && node.daemonId && !isLocalNode) {\n const cached = getSessionMetadata(meshSessionCacheKey(args.node_id, args.session_id || ''));\n const taskId = randomUUID();\n const coordinatorDaemonId = resolveCoordinatorDaemonId(ctx);\n const result = await ipcDispatchToRemoteAgent(ctx, node, {\n session_id: args.session_id,\n message: args.message,\n providerType: cached?.providerType,\n verifiedSession: explicitTargetSession,\n meshContext: {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n taskId,\n ...(coordinatorDaemonId ? { coordinatorDaemonId } : {}),\n // (3) Stamp the originating coordinator session so the worker's completion\n // routes back to THIS coordinator session (multi-coordinator). Survives the\n // P2P dispatch to the remote worker, which echoes it on its completion event.\n ...(ctx.coordinatorSessionId ? { coordinatorSessionId: ctx.coordinatorSessionId } : {}),\n },\n });\n if (result.success) {\n // Record dispatch in ledger so task_history is accurate.\n // Defensive guard: a sessionless dispatch must not record the\n // provider type as a session id (an older ipcDispatch fallback\n // returned resolvedProviderType in result.sessionId). If the\n // returned sessionId equals the provider type, treat it as\n // sessionless so completion matching falls back to taskId.\n const resultSessionId = result.sessionId\n && result.providerType\n && result.sessionId === result.providerType\n ? ''\n : result.sessionId;\n const dispatchedSessionId = args.session_id || resultSessionId;\n const dispatchedAt = new Date().toISOString();\n try {\n const providerType = result.providerType || cached?.providerType;\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'task_dispatched',\n nodeId: args.node_id,\n sessionId: dispatchedSessionId,\n providerType,\n payload: buildDirectTaskPayload(args.message, 'p2p_direct', {\n taskId,\n taskMode,\n providerType,\n targetSessionId: dispatchedSessionId,\n }),\n });\n insertDirectDispatch(ctx.mesh.id, {\n taskId,\n nodeId: args.node_id,\n sessionId: dispatchedSessionId,\n providerType: providerType || undefined,\n message: args.message,\n taskMode: taskMode || undefined,\n via: 'p2p_direct',\n dispatchedAt,\n });\n if (missionId) {\n recordDirectDispatchTask(ctx.mesh.id, args.message, {\n id: taskId,\n missionId,\n assignedNodeId: args.node_id,\n assignedSessionId: dispatchedSessionId,\n taskMode,\n dispatchedAt,\n });\n }\n } catch { /* best-effort */ }\n }\n const returnedSessionId = result.sessionId\n && result.providerType\n && result.sessionId === result.providerType\n ? ''\n : result.sessionId;\n return JSON.stringify({\n ...result,\n nodeId: args.node_id,\n sessionId: result.success ? (args.session_id || returnedSessionId) : args.session_id,\n ...(result.success ? { source: 'direct', taskId } : {}),\n taskMode,\n ...(result.success && result.providerType ? { providerType: result.providerType } : {}),\n dispatched: result.success === true,\n });\n }\n\n // ── LocalTransport or local IpcTransport node ────────────────────────\n // If the coordinator explicitly targets a runtime session, push directly\n // and surface route failures immediately instead of creating a queue item\n // that can remain pending forever when the session was already stopped.\n if (args.session_id) {\n const cached = getSessionMetadata(meshSessionCacheKey(args.node_id, args.session_id));\n let resolvedProviderType = cached?.providerType || '';\n if (!resolvedProviderType) {\n let explicitSession = explicitTargetSession;\n if (!explicitSession) {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n explicitSession = sessions.find(session => readSessionRecordId(session) === args.session_id);\n }\n if (!explicitSession) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_not_found',\n reason: 'mesh_target_session_not_found',\n transport: 'local_ipc',\n retryRecommended: true,\n nodeId: args.node_id,\n sessionId: args.session_id,\n error: `Local session '${args.session_id}' is not present in live status for node '${args.node_id}'.`,\n nextAction: `Launch a fresh session with mesh_launch_session(node_id: '${args.node_id}') or retry without session_id so Repo Mesh can target a live delegate session.`,\n });\n }\n // The early validation block only runs for isWorkerTaskMode (excludes\n // live_debug_readonly). Apply the same coordinator/unmanaged checks here\n // for sessions resolved in this path so no task mode bypasses them.\n if (isMeshCoordinatorSessionRecord(explicitSession)) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_is_coordinator',\n reason: 'mesh_target_session_is_coordinator',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n error: `Session '${args.session_id}' is a Repo Mesh coordinator session, not a visible worker session. Launch or use a visible worker session before dispatching this task.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' and then retry mesh_send_task with that worker session_id, or use mesh_enqueue_task for queue-based worker assignment.`,\n });\n }\n if (isUnmanagedSessionRecord(explicitSession)) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_unmanaged',\n reason: 'mesh_target_session_unmanaged',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n unsafeTranscriptAlias: true,\n unsafeDelegateTarget: true,\n error: `Session '${args.session_id}' on node '${args.node_id}' has no Repo Mesh delegation metadata (missing meshNodeFor/meshCoordinatorFor/launchedByCoordinator). It may be the coordinator's own session or an unrelated session — dispatching risks self-send and orphaned completion events that never reach the coordinator ledger.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' to start a fresh managed worker session, then retry mesh_send_task with the returned session_id. Alternatively use mesh_enqueue_task for queue-based assignment without specifying session_id.`,\n });\n }\n resolvedProviderType = resolveSessionProviderType(explicitSession);\n if (resolvedProviderType) {\n meshSessionProviderMetadata.set(meshSessionCacheKey(args.node_id, args.session_id), {\n providerType: resolvedProviderType,\n providerSessionId: readString(explicitSession?.providerSessionId) || undefined,\n expiresAt: Date.now() + SESSION_PROVIDER_METADATA_TTL_MS,\n });\n }\n }\n if (!resolvedProviderType) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_provider_unknown',\n reason: 'mesh_target_session_provider_unknown',\n transport: 'local_ipc',\n retryRecommended: false,\n nodeId: args.node_id,\n sessionId: args.session_id,\n error: `Local session '${args.session_id}' is live but does not expose providerType/cliType, so agent_command cannot be routed safely.`,\n nextAction: `Relaunch the target session on node '${args.node_id}' or retry without session_id so Repo Mesh can pick a session with provider metadata.`,\n });\n }\n // Apply delivery policy: check session status and decide immediate vs queued vs rejected.\n // Busy/generating sessions must not receive immediate send_chat injection.\n if (explicitTargetSession && !isIdleSessionRecord(explicitTargetSession) && !isTerminalSessionRecord(explicitTargetSession)) {\n const sessionStatus = typeof explicitTargetSession?.status === 'string' ? explicitTargetSession.status : 'unknown';\n const { createSessionDelivery: createDelivery, resolveDeliveryDecision } = await import('@adhdev/daemon-core');\n const policyResult = resolveDeliveryDecision(sessionStatus, { kind: 'task' });\n if (policyResult.decision === 'queued') {\n const delivery = createDelivery({\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType,\n kind: 'task',\n message: args.message,\n status: 'queued',\n });\n return JSON.stringify({\n success: true,\n dispatched: false,\n decision: 'queued_delivery',\n deliveryId: delivery.id,\n reason: policyResult.reason,\n nodeId: args.node_id,\n sessionId: args.session_id,\n sessionStatus,\n taskMode: taskMode || undefined,\n message: policyResult.message,\n nextAction: `Use mesh_status to watch for session idle transition, or use mesh_enqueue_task for queue-based assignment. Check deliveryId '${delivery.id}' to track queued delivery.`,\n });\n }\n }\n\n // Detect whether the session was idle at dispatch time. An idle session that\n // receives agent_command/send_chat should transition to generating. If it stays\n // idle, the dispatch was not acknowledged. Record this for stale detection and\n // surface it as a dispatchAcknowledgementRisk warning in the success response.\n const sessionWasIdle = explicitTargetSession\n ? isIdleSessionRecord(explicitTargetSession)\n : false;\n const taskId = randomUUID();\n const dispatchedAt = new Date().toISOString();\n const coordinatorDaemonId = resolveCoordinatorDaemonId(ctx);\n // Stamp the mesh assignment via meshContext so the daemon can\n // attach it to the target instance BEFORE prompt injection.\n // setupMeshEventForwarding reads state.settings.meshNodeFor +\n // meshActiveTaskId to route completion events back. Without\n // this, plain CLI sessions targeted by mesh_send_task --direct\n // would silently drop generating_completed and the coordinator\n // would never observe task_completed.\n // coordinatorDaemonId is required so the completion event is\n // routed to the correct coordinator pendingCoordinatorEvents queue.\n const dispatchResult = await commandForNode(ctx, node, 'agent_command', {\n targetSessionId: args.session_id,\n agentType: resolvedProviderType,\n cliType: resolvedProviderType,\n providerType: resolvedProviderType,\n action: 'send_chat',\n message: args.message,\n meshContext: {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n taskId,\n ...(coordinatorDaemonId ? { coordinatorDaemonId } : {}),\n // (3) Originating coordinator session anchor — see the remote-dispatch path above.\n ...(ctx.coordinatorSessionId ? { coordinatorSessionId: ctx.coordinatorSessionId } : {}),\n },\n });\n const dispatchPayload = unwrapCommandPayload(dispatchResult);\n if (dispatchPayload?.success === false || dispatchResult?.success === false) {\n const source = dispatchPayload?.success === false ? dispatchPayload : dispatchResult;\n return JSON.stringify({\n ...(source && typeof source === 'object' ? source : {}),\n success: false,\n nodeId: args.node_id,\n sessionId: args.session_id,\n error: dispatchPayload?.error || dispatchResult?.error || 'agent_command rejected the task',\n });\n }\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'task_dispatched',\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType,\n payload: buildDirectTaskPayload(args.message, 'local_direct', {\n taskId,\n taskMode,\n providerType: resolvedProviderType,\n targetSessionId: args.session_id,\n dispatchedToIdleSession: sessionWasIdle,\n }),\n });\n } catch { /* best-effort */ }\n insertDirectDispatch(ctx.mesh.id, {\n taskId,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType || undefined,\n message: args.message,\n taskMode: taskMode || undefined,\n via: 'local_direct',\n dispatchedToIdleSession: sessionWasIdle,\n dispatchedAt,\n });\n if (missionId) {\n try {\n recordDirectDispatchTask(ctx.mesh.id, args.message, {\n id: taskId,\n missionId,\n assignedNodeId: args.node_id,\n assignedSessionId: args.session_id,\n taskMode,\n dispatchedAt,\n });\n } catch { /* best-effort */ }\n }\n // Create a delivery record for session-level ACK tracking\n let deliveryId: string | undefined;\n try {\n const { createSessionDelivery: createDelivery } = await import('@adhdev/daemon-core');\n const delivery = createDelivery({\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType || undefined,\n taskId,\n kind: 'task',\n message: args.message,\n status: sessionWasIdle ? 'delivered' : 'delivering',\n });\n deliveryId = delivery.id;\n } catch { /* best-effort */ }\n return JSON.stringify({\n success: true,\n dispatched: true,\n decision: 'immediate',\n source: 'direct',\n taskId,\n deliveryId,\n taskMode,\n providerType: resolvedProviderType,\n nodeId: args.node_id,\n sessionId: args.session_id,\n ...(sessionWasIdle ? {\n dispatchAcknowledgementRisk: true,\n dispatchAcknowledgementRiskReason: 'session_was_idle_at_dispatch',\n dispatchAcknowledgementNote: `Session '${args.session_id}' was idle at dispatch time. If it does not transition to generating, this direct task was not acknowledged. Use mesh_status to verify; if the session remains idle, it may appear as stale direct work — launch a fresh session and retry.`,\n } : {}),\n });\n }\n\n // ── Untargeted local task: use queue pull ─────────────────────────────\n const task = enqueueTask(ctx.mesh.id, args.message, {\n targetNodeId: args.node_id,\n targetSessionId: args.session_id,\n taskMode,\n ...(missionId ? { missionId } : {}),\n });\n\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n\n // Also drain any pending coordinator events so the caller sees them inline\n const pendingEvents = drainPendingMeshCoordinatorEvents(ctx.mesh.id, ctx.localDaemonId);\n\n const result: Record<string, unknown> = {\n success: true,\n source: 'queue',\n nodeId: args.node_id,\n taskId: task.id,\n status: task.status,\n taskMode: task.taskMode,\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n };\n if (pendingEvents.length > 0) {\n result.pendingCoordinatorEvents = pendingEvents;\n }\n return JSON.stringify(result);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'mesh_send_task',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n sessionId: args.session_id,\n });\n return JSON.stringify(failure);\n }\n}\n\nexport async function meshReadChat(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; provider_session_id?: string; tail?: number; compact?: boolean },\n): Promise<string> {\n const node = await findOptionalNodeWithRefresh(ctx, args.node_id);\n if (!node) {\n return JSON.stringify(buildMissingNodeReadChatRecovery(ctx, args), null, 2);\n }\n\n await drainCoordinatorPendingEvents(ctx, { nodeIds: [args.node_id] });\n\n const cached = resolveMeshSessionProviderMetadata(ctx, args.node_id, args.session_id);\n const providerSessionId = typeof args.provider_session_id === 'string' && args.provider_session_id.trim()\n ? args.provider_session_id.trim()\n : cached?.providerSessionId;\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n let result: any;\n try {\n result = await commandForNode(ctx, node, 'read_chat', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n workspace: node.workspace,\n ...(cached?.providerType ? { agentType: cached.providerType, providerType: cached.providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n tailLimit: args.tail ?? 10,\n });\n } catch (e: any) {\n // Local read_chat and non-transport (provider/logic) failures keep the existing\n // throw so genuine errors still surface. The cache fallback covers ONLY a remote\n // P2P transport failure (saturated/unreachable peer): mesh_status already degrades\n // its P2P probe gracefully (collectLiveStatusProbe) — read_chat had no catch and\n // hard-failed at the 30s timeout instead of surfacing the coordinator's cached\n // summary. See buildMeshReadChatCacheFallback.\n if (isLocalNode || !isP2pRelayTransportFailure(e)) throw e;\n return buildMeshReadChatCacheFallback(ctx, args, node, e);\n }\n const payload = annotateRapidReadChatAdvisory(unwrapCommandPayload(result) as Record<string, any>, {\n key: `mesh:${args.node_id}:${args.session_id}`,\n toolName: 'mesh_read_chat',\n completionCallbackExpected: true,\n });\n // Default compact=true to keep coordinator context lean.\n // Pass compact=false explicitly only when full transcript detail is needed for debugging.\n const useCompact = args.compact !== false;\n if (useCompact) {\n const compactPayload = compactChatPayload(payload, {\n nodeId: args.node_id,\n sessionId: args.session_id,\n limit: args.tail ?? 10,\n });\n return JSON.stringify(\n payload.pollingAdvisory ? { ...compactPayload, pollingAdvisory: payload.pollingAdvisory } : compactPayload,\n null,\n 2,\n );\n }\n return JSON.stringify(payload, null, 2);\n}\n\nexport async function meshReadDebug(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; provider_session_id?: string; tail?: number; delivery?: 'daemon_file' | 'inline' },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const cached = resolveMeshSessionProviderMetadata(ctx, args.node_id, args.session_id);\n const providerSessionId = typeof args.provider_session_id === 'string' && args.provider_session_id.trim()\n ? args.provider_session_id.trim()\n : cached?.providerSessionId;\n const delivery = args.delivery === 'inline' ? undefined : 'daemon_file';\n const result = await commandForNode(ctx, node, 'get_chat_debug_bundle', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n workspace: node.workspace,\n ...(cached?.providerType ? { agentType: cached.providerType, providerType: cached.providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n tailLimit: args.tail ?? 40,\n ...(delivery ? { delivery } : {}),\n });\n const payload = unwrapCommandPayload(result);\n return JSON.stringify(payload, null, 2);\n}\n\nexport async function meshLaunchSession(\n ctx: MeshContext,\n args: { node_id: string; type?: string; force?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n const bootstrapBlock = getWorktreeBootstrapLaunchBlock(node, ctx.mesh.policy);\n if (bootstrapBlock) return JSON.stringify(bootstrapBlock, null, 2);\n\n {\n let resolvedProviderType = typeof args.type === 'string' && args.type.trim() ? args.type : '';\n if (!resolvedProviderType) {\n const providerPriority = readProviderPriority(node.policy);\n if (!providerPriority.length) {\n return JSON.stringify({ success: false, error: missingProviderPriorityMessage(args.node_id) });\n }\n\n const failed: string[] = [];\n for (const providerType of providerPriority) {\n const detectedResult = await commandForNode(ctx, node, 'detect_provider', { providerType });\n const detectedPayload = unwrapCommandPayload(detectedResult);\n if (detectedPayload?.success && detectedPayload?.detected) {\n resolvedProviderType = providerType;\n break;\n }\n failed.push(`${providerType}: ${detectedPayload?.error || 'not detected'}`);\n }\n if (!resolvedProviderType) {\n return JSON.stringify({ success: false, error: `No usable provider detected for node '${args.node_id}' from providerPriority: ${failed.join('; ')}` });\n }\n }\n\n const coordinatorNode = resolveCoordinatorNode(ctx);\n const coordinatorDaemonId = resolveCoordinatorDaemonId(ctx);\n const spawnedSessionVisibility = readSpawnedSessionVisibility(ctx.mesh.policy);\n // Worker sessions are coordinator-dispatched; a human shouldn't have to approve\n // each one. Resolve the auto-approve policy (node override → mesh policy → default\n // true) and stamp it into the launch settings envelope so it wins over the global\n // per-provider-type autoApprove config via the settingsOverride merge.\n const delegatedWorkerAutoApprove = resolveDelegatedWorkerAutoApprove(ctx.mesh.policy, node.policy);\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n if (node.daemonId && !isLocalNode && !coordinatorDaemonId) {\n return JSON.stringify(buildMissingCoordinatorDaemonIdFailure(ctx, node, resolvedProviderType), null, 2);\n }\n\n // MESH-LAUNCH-DUP-GUARD: an enqueue auto-launch (queue task → daemon spawns a worker)\n // races a manual mesh_launch_session for the same node/worktree. Without this guard the\n // manual call unconditionally issues a second launch_cli, leaving an empty duplicate\n // worker session alongside the one doing the work (\"채팅 2개\"). Right before launch, probe\n // live status and, if a non-terminal mesh-owned worker session for THIS mesh+node already\n // exists (idle OR still booting/generating), return it idempotently instead of spawning a\n // duplicate. force=true bypasses the guard for a deliberate additional session. Placed\n // AFTER provider resolution + the coordinator-id fail-closed check so an unlaunchable node\n // never burns a status relay (and the relay-blocked invariant holds).\n if (args.force !== true) {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n const existing = sessions.find(session =>\n !isTerminalSessionRecord(session)\n && isMeshOwnedDelegateSession(session, ctx.mesh.id, args.node_id));\n if (existing) {\n const existingSessionId = readSessionRecordId(existing);\n if (existingSessionId) {\n const existingProviderType = resolveSessionProviderType(existing) || resolvedProviderType || undefined;\n const existingStatus = typeof existing?.status === 'string' ? existing.status : 'unknown';\n return JSON.stringify({\n success: true,\n duplicate: true,\n launched: false,\n reused: true,\n sessionId: existingSessionId,\n nodeId: args.node_id,\n ...(existingProviderType ? { resolvedProviderType: existingProviderType, providerType: existingProviderType } : {}),\n sessionStatus: existingStatus,\n idle: isIdleSessionRecord(existing),\n reason: 'mesh_launch_session_duplicate_guard',\n warning: `Node '${args.node_id}' already has a live mesh-owned worker session ('${existingSessionId}', status '${existingStatus}'). Returning it instead of launching an empty duplicate (likely an enqueue auto-launch already spawned it).`,\n nextAction: `Use session '${existingSessionId}' for mesh_send_task/mesh_read_chat. If you intentionally need a second concurrent session on this node, retry mesh_launch_session with force=true.`,\n }, null, 2);\n }\n }\n } catch {\n // Status probe failed (transport/timeout). Fail open — proceed to launch rather\n // than blocking a legitimate launch on an unreachable status probe. A duplicate is\n // recoverable (mesh_cleanup_sessions); a blocked launch on a transient probe error\n // is worse for the coordinator flow.\n }\n }\n\n let result: any;\n try {\n result = await commandForNode(ctx, node, 'launch_cli', {\n cliType: resolvedProviderType,\n dir: node.workspace,\n settings: {\n // Worker launch envelope (A5): structured metadata so worker sessions\n // know their role and can route completion events back correctly.\n role: 'worker',\n meshNodeFor: ctx.mesh.id,\n meshNodeId: args.node_id,\n spawnedSessionVisibility,\n // Delegated worker auto-approval (see resolveDelegatedWorkerAutoApprove).\n // Lands in settingsOverride and beats the global per-provider autoApprove.\n autoApprove: delegatedWorkerAutoApprove,\n ...(coordinatorDaemonId ? { meshCoordinatorDaemonId: coordinatorDaemonId } : {}),\n // (3) Stamp the originating coordinator SESSION at launch too, so a worker\n // launched via mesh_launch_session routes its completions back to the exact\n // coordinator session (multi-coordinator). Absent → daemon-level fallback.\n ...(ctx.coordinatorSessionId ? { meshCoordinatorSessionId: ctx.coordinatorSessionId } : {}),\n ...(coordinatorNode?.id ? { meshCoordinatorNodeId: coordinatorNode.id } : {}),\n launchedByCoordinator: true,\n }\n });\n } catch (e: any) {\n return JSON.stringify(recordRecoverableLaunchFailure(ctx, node, resolvedProviderType, e), null, 2);\n }\n const launchPayload = extractLaunchPayload(result);\n if (launchPayload?.success === false || result?.success === false) {\n const launchError = new Error(launchPayload?.error || result?.error || 'launch_cli rejected the session launch');\n return JSON.stringify(recordRecoverableLaunchFailure(ctx, node, resolvedProviderType, launchError), null, 2);\n }\n const runtimeSessionId = typeof launchPayload?.sessionId === 'string'\n ? launchPayload.sessionId\n : typeof launchPayload?.id === 'string'\n ? launchPayload.id\n : typeof launchPayload?.runtimeSessionId === 'string'\n ? launchPayload.runtimeSessionId\n : '';\n const providerSessionId = typeof launchPayload?.providerSessionId === 'string' && launchPayload.providerSessionId.trim()\n ? launchPayload.providerSessionId.trim()\n : undefined;\n if (runtimeSessionId) {\n meshSessionProviderMetadata.set(meshSessionCacheKey(args.node_id, runtimeSessionId), {\n providerType: resolvedProviderType,\n ...(providerSessionId ? { providerSessionId } : {}),\n expiresAt: Date.now() + SESSION_PROVIDER_METADATA_TTL_MS,\n });\n }\n // Record session launch in ledger\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'session_launched',\n nodeId: args.node_id,\n sessionId: runtimeSessionId || undefined,\n providerType: resolvedProviderType,\n payload: { providerSessionId },\n });\n } catch { /* ledger append is best-effort */ }\n\n // Tell daemon to trigger queue processing so the new session immediately picks up pending tasks.\n // Surface the trigger result so coordinators can distinguish \"session launched\"\n // from \"queued work actually claimed by that session\".\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n\n return JSON.stringify({\n ...launchPayload,\n resolvedProviderType,\n ...(providerSessionId ? { providerSessionId } : {}),\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n }, null, 2);\n }\n}\n\nexport async function meshApprove(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; action: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id); // membership check\n\n const cached = getSessionMetadata(meshSessionCacheKey(args.node_id, args.session_id));\n const providerSessionId = cached?.providerSessionId;\n const result = await commandForNode(ctx, node, 'resolve_action', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n workspace: node.workspace,\n ...(cached?.providerType ? { agentType: cached.providerType, providerType: cached.providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n action: args.action === 'reject' ? 'reject' : 'approve',\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshCleanupSessions(\n ctx: MeshContext,\n args: { node_id: string; mode: string; session_ids?: string[]; dry_run?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const result = await commandForNode(ctx, node, 'cleanup_mesh_sessions', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n mode: args.mode,\n sessionIds: args.session_ids,\n dryRun: args.dry_run === true,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n","// Mesh tool implementations — git domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n IpcTransport,\n appendLedgerEntry,\n buildCoordinatorP2pRelayFailure,\n buildRemoveNodeArgs,\n collectRelatedRepoStatuses,\n commandForNode,\n extractCloneNodePayload,\n extractGitDiff,\n extractGitStatus,\n extractSubmodules,\n findNodeWithRefresh,\n isP2pTransportUnavailableError,\n refreshMeshFromDaemon,\n syncCoordinatorDaemonMeshCache,\n unwrapCommandPayload,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\nexport async function meshGitStatus(\n ctx: MeshContext,\n args: { node_id: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n // Determine submodule options from node policy\n const autoDiscoverSubmodules = (node.policy as any)?.autoDiscoverSubmodules !== false;\n const submoduleIgnorePaths = (node.policy as any)?.submoduleIgnorePaths || [];\n\n try {\n const statusResult = await commandForNode(ctx, node, 'git_status', {\n workspace: node.workspace,\n refreshUpstream: true,\n includeSubmodules: autoDiscoverSubmodules,\n submoduleIgnorePaths: submoduleIgnorePaths.length > 0 ? submoduleIgnorePaths : undefined,\n });\n const diffResult = await commandForNode(ctx, node, 'git_diff_summary', {\n workspace: node.workspace,\n });\n return JSON.stringify({\n nodeId: args.node_id,\n workspace: node.workspace,\n status: extractGitStatus(statusResult),\n diff: extractGitDiff(diffResult),\n submodules: autoDiscoverSubmodules ? extractSubmodules(statusResult, submoduleIgnorePaths) : undefined,\n relatedRepos: await collectRelatedRepoStatuses(ctx, node),\n }, null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'git_status',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify({\n ...failure,\n workspace: node.workspace,\n }, null, 2);\n }\n}\n\nexport async function meshReadNodeLogs(\n ctx: MeshContext,\n args: { node_id: string; grep?: string; since_ms?: number; tail_bytes?: number; date?: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n try {\n const result = await commandForNode(ctx, node, 'get_mesh_node_logs', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n ...(typeof args.grep === 'string' && args.grep.trim() ? { grep: args.grep.trim() } : {}),\n ...(Number.isFinite(args.since_ms) ? { sinceMs: args.since_ms } : {}),\n ...(Number.isFinite(args.tail_bytes) ? { tailBytes: args.tail_bytes } : {}),\n ...(typeof args.date === 'string' && args.date.trim() ? { date: args.date.trim() } : {}),\n });\n const payload = unwrapCommandPayload(result);\n return JSON.stringify(payload, null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'get_mesh_node_logs',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify(failure, null, 2);\n }\n}\n\nexport async function meshFastForwardNode(\n ctx: MeshContext,\n args: { node_id: string; mode?: 'merge' | 'push'; branch?: string; execute?: boolean; dry_run?: boolean; update_submodules?: boolean; push_submodules?: boolean },\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const node = await findNodeWithRefresh(ctx, args.node_id);\n const submoduleIgnorePaths = (node.policy as any)?.submoduleIgnorePaths || [];\n\n if (node.policy?.readOnly) {\n return JSON.stringify({\n success: false,\n code: 'node_read_only',\n nodeId: args.node_id,\n workspace: node.workspace,\n allowed: false,\n willRun: false,\n executed: false,\n blockingReasons: ['node_read_only'],\n }, null, 2);\n }\n\n try {\n const dryRun = args.dry_run === true || args.execute !== true;\n const result = await commandForNode(ctx, node, 'fast_forward_mesh_node', {\n meshId: ctx.mesh.id,\n nodeId: node.id,\n workspace: node.workspace,\n mode: args.mode === 'push' ? 'push' : 'merge',\n branch: typeof args.branch === 'string' ? args.branch : undefined,\n execute: args.execute === true && args.dry_run !== true,\n dryRun,\n updateSubmodules: args.update_submodules === true,\n pushSubmodules: args.push_submodules === true,\n submoduleIgnorePaths: submoduleIgnorePaths.length > 0 ? submoduleIgnorePaths : undefined,\n });\n return JSON.stringify(unwrapCommandPayload(result), null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'fast_forward_mesh_node',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify({\n ...failure,\n workspace: node.workspace,\n allowed: false,\n willRun: false,\n executed: false,\n blockingReasons: [failure.code || 'mesh_fast_forward_unavailable'],\n }, null, 2);\n }\n}\n\nexport async function meshRestartDaemon(\n ctx: MeshContext,\n args: { node_id: string; channel?: 'stable' | 'preview' },\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n try {\n // inlineMesh lets the owning daemon resolve this node for the\n // remote-forward guard; channel is forwarded only when explicitly set so\n // an unset call keeps the daemon on its configured channel.\n const result = await commandForNode(ctx, node, 'restart_daemon_node', {\n meshId: ctx.mesh.id,\n nodeId: node.id,\n inlineMesh: ctx.mesh,\n ...(args.channel ? { channel: args.channel } : {}),\n });\n return JSON.stringify(unwrapCommandPayload(result), null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'restart_daemon_node',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify(failure, null, 2);\n }\n}\n\nexport async function meshCheckpoint(\n ctx: MeshContext,\n args: { node_id: string; message: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n // Policy checks\n if (node.policy?.readOnly) {\n return JSON.stringify({ error: `Node '${args.node_id}' is read-only — cannot checkpoint` });\n }\n\n const result = await commandForNode(ctx, node, 'git_checkpoint', {\n workspace: node.workspace,\n message: args.message,\n includeUntracked: true,\n });\n\n // Record checkpoint in ledger\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'checkpoint_created',\n nodeId: args.node_id,\n payload: {\n message: args.message,\n commit: (result as any)?.checkpoint?.commit,\n outcome: (result as any)?.checkpoint?.status || ((result as any)?.checkpoint?.noop ? 'skipped' : undefined),\n noop: (result as any)?.checkpoint?.noop === true,\n reason: (result as any)?.checkpoint?.reason,\n },\n });\n } catch { /* ledger append is best-effort */ }\n\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshCloneNode(\n ctx: MeshContext,\n args: { source_node_id: string; branch: string; base_branch?: string },\n): Promise<string> {\n const sourceNode = await findNodeWithRefresh(ctx, args.source_node_id);\n\n const result = await commandForNode(ctx, sourceNode, 'clone_mesh_node', {\n meshId: ctx.mesh.id,\n sourceNodeId: args.source_node_id,\n branch: args.branch,\n baseBranch: args.base_branch,\n inlineMesh: ctx.mesh,\n });\n const clonePayload = extractCloneNodePayload(result);\n if (clonePayload?.success && clonePayload.node?.id) {\n const existingIndex = ctx.mesh.nodes.findIndex(n => n.id === clonePayload.node.id);\n if (existingIndex >= 0) ctx.mesh.nodes[existingIndex] = clonePayload.node;\n else ctx.mesh.nodes.push(clonePayload.node);\n ctx.mesh.updatedAt = new Date().toISOString();\n await syncCoordinatorDaemonMeshCache(ctx);\n }\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRemoveNode(\n ctx: MeshContext,\n args: { node_id: string; session_cleanup_mode?: string; force?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const removeArgs = buildRemoveNodeArgs(ctx, args.node_id, args.session_cleanup_mode, args.force === true);\n let result: any;\n let transportFallback: Record<string, unknown> | undefined;\n try {\n result = await commandForNode(ctx, node, 'remove_mesh_node', removeArgs);\n } catch (e: any) {\n if (ctx.transport instanceof IpcTransport && (node as any).isLocalWorktree && isP2pTransportUnavailableError(e)) {\n result = await ctx.transport.command('remove_mesh_node', removeArgs);\n transportFallback = {\n from: 'p2p_mesh_relay',\n to: 'local_control_plane',\n reason: e?.message || String(e),\n };\n } else {\n return JSON.stringify({\n success: false,\n code: isP2pTransportUnavailableError(e) ? 'p2p_unavailable' : 'mesh_remove_node_failed',\n error: e?.message || String(e),\n recoveryHint: isP2pTransportUnavailableError(e)\n ? 'If this is an ADHDev-managed local worktree, retry from a coordinator connected to the daemon that owns the worktree; dashboard command/data-plane traffic still requires P2P.'\n : 'Inspect mesh_status and retry after resolving the reported failure.',\n }, null, 2);\n }\n }\n if (result?.success && result.removed !== false) {\n const idx = ctx.mesh.nodes.findIndex(n => n.id === args.node_id);\n if (idx >= 0) {\n ctx.mesh.nodes.splice(idx, 1);\n ctx.mesh.updatedAt = new Date().toISOString();\n }\n }\n return JSON.stringify({ ...(result || {}), ...(transportFallback ? { transportFallback } : {}) }, null, 2);\n}\n","// Mesh tool implementations — refine domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n commandForNode,\n findNodeWithRefresh,\n refreshMeshFromDaemon,\n resolveRefineConfigNode,\n unwrapCommandPayload,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\nexport async function meshRefineConfigSchema(ctx: MeshContext): Promise<string> {\n const node = resolveRefineConfigNode(ctx);\n const result = await commandForNode(ctx, node, 'get_mesh_refine_config_schema', {});\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshValidateRefineConfig(\n ctx: MeshContext,\n args: { node_id?: string; config?: Record<string, unknown> },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'validate_mesh_refine_config', {\n workspace: node.workspace,\n inlineMesh: ctx.mesh,\n ...(args.config ? { config: args.config } : {}),\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshSuggestRefineConfig(\n ctx: MeshContext,\n args: { node_id?: string },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'suggest_mesh_refine_config', {\n workspace: node.workspace,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshChangeImpactConfigSchema(ctx: MeshContext): Promise<string> {\n const node = resolveRefineConfigNode(ctx);\n const result = await commandForNode(ctx, node, 'get_mesh_change_impact_config_schema', {});\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshValidateChangeImpactConfig(\n ctx: MeshContext,\n args: { node_id?: string; config?: Record<string, unknown> },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'validate_mesh_change_impact_config', {\n workspace: node.workspace,\n ...(args.config ? { config: args.config } : {}),\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshSuggestChangeImpactConfig(\n ctx: MeshContext,\n args: { node_id?: string },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'suggest_mesh_change_impact_config', {\n workspace: node.workspace,\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshInit(\n ctx: MeshContext,\n args: { node_id?: string; write?: boolean; overwrite?: boolean },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'mesh_init', {\n workspace: node.workspace,\n inlineMesh: ctx.mesh,\n ...(args.write !== undefined ? { write: args.write } : {}),\n ...(args.overwrite !== undefined ? { overwrite: args.overwrite } : {}),\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRefinePlan(\n ctx: MeshContext,\n args: { node_id: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'plan_mesh_refine_node', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRefineNode(\n ctx: MeshContext,\n args: { node_id: string; execute?: boolean; dry_run?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const result = await commandForNode(ctx, node, 'refine_mesh_node', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n ...(args.execute !== undefined ? { execute: args.execute } : {}),\n ...(args.dry_run !== undefined ? { dryRun: args.dry_run } : {}),\n inlineMesh: ctx.mesh,\n });\n if (result?.success && result.async !== true && result.removeResult?.removed !== false) {\n const idx = ctx.mesh.nodes.findIndex(n => n.id === args.node_id);\n if (idx >= 0) {\n ctx.mesh.nodes.splice(idx, 1);\n ctx.mesh.updatedAt = new Date().toISOString();\n }\n }\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRefineBatch(\n ctx: MeshContext,\n args: { node_ids?: string[]; execute?: boolean; dry_run?: boolean } = {},\n): Promise<string> {\n // Refresh so auto-collection and explicit node IDs resolve against the latest\n // mesh membership (siblings may have been created/removed in this MCP session).\n await refreshMeshFromDaemon(ctx);\n const nodeIds = Array.isArray(args.node_ids)\n ? args.node_ids.filter((v): v is string => typeof v === 'string' && v.trim().length > 0).map(v => v.trim())\n : undefined;\n\n // The batch orchestrator runs on the coordinator daemon that owns the source repo\n // and worktrees. Drive it through the local control-plane transport (the same\n // daemon that hosts these worktree nodes), passing inlineMesh so inline-cache-only\n // clone nodes resolve.\n const result = await ctx.transport.command('batch_refine_mesh_nodes', {\n meshId: ctx.mesh.id,\n ...(nodeIds ? { nodeIds } : {}),\n ...(args.execute !== undefined ? { execute: args.execute } : {}),\n ...(args.dry_run !== undefined ? { dryRun: args.dry_run } : {}),\n inlineMesh: ctx.mesh,\n });\n\n // On a successful synchronous execute, prune merged/skipped nodes from the local\n // mesh snapshot so subsequent tool calls don't re-target already-converged worktrees.\n // The execute path is now async (async:true / status:'accepted') — per-node results\n // arrive later via terminal refine events, so there is nothing to prune yet. Only the\n // legacy/synchronous batch result (with inline `results`) is pruned here.\n const payload = unwrapCommandPayload(result) ?? result;\n if (payload?.batch && payload?.dryRun === false && payload?.async !== true && Array.isArray(payload?.results)) {\n for (const outcome of payload.results) {\n if (outcome?.convergence === 'merged_to_main' || outcome?.convergence === 'skipped_patch_equivalent') {\n const idx = ctx.mesh.nodes.findIndex(n => n.id === outcome.nodeId);\n if (idx >= 0) ctx.mesh.nodes.splice(idx, 1);\n }\n }\n ctx.mesh.updatedAt = new Date().toISOString();\n }\n return JSON.stringify(result, null, 2);\n}\n","import { ALL_MESH_TOOLS } from './tools/mesh-tools.js';\n\nconst STANDARD_TOOLS = [\n 'list_daemons',\n 'list_sessions',\n 'launch_session',\n 'stop_session',\n 'check_pending',\n 'read_chat',\n 'read_chat_debug',\n 'send_chat',\n 'approve',\n 'git_status',\n 'git_log',\n 'git_diff',\n 'git_checkpoint',\n 'git_push',\n 'screenshot',\n];\n\nexport function buildMcpHelpText(): string {\n const meshTools = ALL_MESH_TOOLS.map(tool => tool.name);\n return `\nADHDev MCP Server\n\nUsage:\n adhdev mcp Local mode (requires standalone daemon)\n adhdev mcp --mode ipc --repo-mesh <mesh_id> Cloud daemon IPC mesh mode\n adhdev-mcp --help Compatibility bin (same server, legacy package entrypoint)\n\nOptions:\n --mode <mode> Transport: local or ipc\n --port <n> Standalone or IPC daemon port (defaults: local 3847, ipc 19222)\n --password <pass> Standalone daemon password (if set)\n --repo-mesh <mesh_id> Enable mesh mode — exposes only mesh-scoped coordinator tools\n --help Show this help\n\nEnvironment variables:\n ADHDEV_PASSWORD Daemon password (local mode)\n ADHDEV_MESH_ID Mesh ID (mesh mode)\n ADHDEV_MCP_TRANSPORT Transport: local or ipc\n\nStandard tools: ${STANDARD_TOOLS.join(', ')}\nMesh tools: ${meshTools.join(', ')}\n`.trim();\n}\n","/**\n * ADHDev MCP Server\n *\n * Exposes IDE agent sessions as MCP tools via stdio transport.\n * Two modes:\n * local — talks to standalone daemon at localhost:3847\n * ipc — talks to cloud daemon local IPC at localhost:19222\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport os from 'node:os';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { LocalTransport } from './transports/local.js';\nimport { IpcTransport } from './transports/ipc.js';\nimport type { CommandTransport } from './transports/mode.js';\n\nimport { LIST_SESSIONS_TOOL, listSessions } from './tools/list-sessions.js';\nimport { LIST_DAEMONS_TOOL, listDaemons } from './tools/list-daemons.js';\nimport { READ_CHAT_TOOL, readChat } from './tools/read-chat.js';\nimport { READ_CHAT_DEBUG_TOOL, readChatDebug } from './tools/read-chat-debug.js';\nimport { SPEC_DEBUG_TOOL, specDebug } from './tools/spec-debug.js';\nimport { SEND_CHAT_TOOL, sendChat } from './tools/send-chat.js';\nimport { APPROVE_TOOL, approve } from './tools/approve.js';\nimport { SCREENSHOT_TOOL, screenshot } from './tools/screenshot.js';\nimport { GIT_STATUS_TOOL, gitStatus } from './tools/git-status.js';\nimport { GIT_LOG_TOOL, gitLog } from './tools/git-log.js';\nimport { GIT_DIFF_TOOL, gitDiff } from './tools/git-diff.js';\nimport { GIT_CHECKPOINT_TOOL, gitCheckpoint } from './tools/git-checkpoint.js';\nimport { GIT_PUSH_TOOL, gitPush } from './tools/git-push.js';\nimport { LAUNCH_SESSION_TOOL, launchSession } from './tools/launch-session.js';\nimport { STOP_SESSION_TOOL, stopSession } from './tools/stop-session.js';\nimport { CHECK_PENDING_TOOL, checkPending } from './tools/check-pending.js';\nimport {\n ALL_MESH_TOOLS, meshStatus, meshListNodes, meshSendTask, meshReadChat,\n meshEnqueueTask, meshViewQueue, meshQueueCancel, meshQueueRequeue,\n meshReadDebug,\n meshLaunchSession, meshGitStatus, meshReadNodeLogs, meshFastForwardNode, meshRestartDaemon, meshCheckpoint, meshApprove,\n meshCloneNode, meshRemoveNode, meshRefineNode,\n meshRefineConfigSchema, meshValidateRefineConfig, meshSuggestRefineConfig, meshInit, meshRefinePlan, meshRefineBatch,\n meshChangeImpactConfigSchema, meshValidateChangeImpactConfig, meshSuggestChangeImpactConfig,\n meshCleanupSessions, meshPruneStaleDirect, meshTaskHistory, meshRecordNote, meshReconcileLedger, meshMissionUpsert,\n meshMissionList, meshReviewInbox\n} from './tools/mesh-tools.js';\nimport type { MeshContext } from './tools/mesh-tools.js';\n\nexport interface AdhdevMcpServerOptions {\n mode: 'local' | 'ipc';\n // local options\n port?: number;\n password?: string;\n // mesh mode (optional — restricts tools to mesh-scoped set)\n meshId?: string;\n}\n\nexport async function buildMeshModeCoordinatorPrompt(mesh: any): Promise<string> {\n try {\n const { buildCoordinatorSystemPrompt } = await import('@adhdev/daemon-core');\n return buildCoordinatorSystemPrompt({ mesh });\n } catch (e: any) {\n throw new Error(`Failed to build Repo Mesh coordinator prompt: ${e?.message ?? String(e)}`);\n }\n}\n\nexport async function startMcpServer(opts: AdhdevMcpServerOptions): Promise<void> {\n const transport: CommandTransport =\n opts.mode === 'ipc'\n ? new IpcTransport({ port: opts.port })\n : new LocalTransport({ port: opts.port, password: opts.password });\n\n // Verify connectivity before registering tools\n const alive = await transport.ping();\n if (!alive) {\n const hint =\n opts.mode === 'local'\n ? `Make sure the standalone daemon is running (adhdev standalone or npx @adhdev/daemon-standalone).`\n : `Make sure the cloud daemon is running with local IPC enabled (adhdev daemon).`;\n process.stderr.write(`[adhdev-mcp] Cannot reach ${opts.mode} daemon. ${hint}\\n`);\n process.exit(1);\n }\n\n const isLocal = opts.mode === 'local';\n\n // ── Mesh Mode ─────────────────────────────────\n if (opts.meshId) {\n let mesh: any;\n\n // Priority 1: ADHDEV_INLINE_MESH env var (set by daemon in .mcp.json for cloud meshes)\n if (!mesh && process.env.ADHDEV_INLINE_MESH) {\n try {\n mesh = JSON.parse(process.env.ADHDEV_INLINE_MESH);\n process.stderr.write(`[adhdev-mcp] Loaded mesh config from ADHDEV_INLINE_MESH env\\n`);\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Failed to parse ADHDEV_INLINE_MESH: ${e.message}\\n`);\n }\n }\n\n // Priority 2: Local ~/.adhdev/meshes.json\n if (!mesh) {\n try {\n const { getMesh } = await import('@adhdev/daemon-core');\n mesh = getMesh(opts.meshId);\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Local meshes.json lookup failed: ${e.message}\\n`);\n }\n }\n\n // Fallback: query the running daemon (supports cloud-originating meshes\n // launched via inlineMesh that don't exist in local meshes.json)\n if (!mesh && (transport instanceof LocalTransport || transport instanceof IpcTransport)) {\n try {\n const result = await transport.command('get_mesh', { meshId: opts.meshId });\n if (result?.success && result.mesh) {\n mesh = result.mesh;\n process.stderr.write(`[adhdev-mcp] Loaded mesh config from daemon\\n`);\n }\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Daemon mesh query failed: ${e.message}\\n`);\n }\n }\n\n if (!mesh) {\n process.stderr.write(`[adhdev-mcp] Mesh '${opts.meshId}' not found in local config. Use 'adhdev mesh list' to see available meshes.\\n`);\n process.exit(1);\n }\n\n let localDaemonId: string | undefined;\n let localMachineId: string | undefined;\n let coordinatorHostname: string | undefined = os.hostname();\n\n if (transport instanceof LocalTransport || transport instanceof IpcTransport) {\n try {\n const { loadConfig } = await import('@adhdev/daemon-core');\n const cfg = loadConfig();\n if (cfg.machineId) localMachineId = cfg.machineId;\n else if (cfg.registeredMachineId) localMachineId = cfg.registeredMachineId;\n } catch { /* best-effort */ }\n }\n\n if (transport instanceof IpcTransport) {\n try {\n const statusResult = await transport.getStatus();\n const instanceId = typeof statusResult?.status?.instanceId === 'string' ? statusResult.status.instanceId.trim() : '';\n const hostname = typeof statusResult?.status?.hostname === 'string'\n ? statusResult.status.hostname.trim()\n : typeof statusResult?.status?.machine?.hostname === 'string'\n ? statusResult.status.machine.hostname.trim()\n : '';\n if (instanceId) localDaemonId = instanceId;\n if (hostname) coordinatorHostname = hostname;\n } catch { /* best-effort metadata for remote completion forwarding */ }\n }\n\n // (3) Session-anchored routing: the daemon injects this coordinator CLI session's own\n // runtime id via ADHDEV_COORDINATOR_SESSION_ID at launch. Carrying it on MeshContext lets\n // every dispatch stamp the originating coordinator session so the worker's completion\n // routes back to the right session (multi-coordinator). Absent → daemon-level fallback.\n const coordinatorSessionId = typeof process.env.ADHDEV_COORDINATOR_SESSION_ID === 'string' && process.env.ADHDEV_COORDINATOR_SESSION_ID.trim()\n ? process.env.ADHDEV_COORDINATOR_SESSION_ID.trim()\n : undefined;\n\n const meshCtx: MeshContext = { mesh, transport, ...(localDaemonId ? { localDaemonId } : {}), ...(localMachineId ? { localMachineId } : {}), ...(coordinatorHostname ? { coordinatorHostname } : {}), ...(coordinatorSessionId ? { coordinatorSessionId } : {}) };\n\n const coordinatorPrompt = await buildMeshModeCoordinatorPrompt(mesh);\n\n const server = new Server(\n { name: 'adhdev-mcp-server', version: '0.9.82' },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n // Expose coordinator prompt as MCP resource\n const { ListResourcesRequestSchema, ReadResourceRequestSchema } = await import('@modelcontextprotocol/sdk/types.js');\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [{\n uri: 'coordinator://system-prompt',\n name: 'Coordinator System Prompt',\n description: `System prompt for mesh \"${mesh.name}\" coordinator`,\n mimeType: 'text/plain',\n }],\n }));\n server.setRequestHandler(ReadResourceRequestSchema, async (req) => {\n if (req.params.uri === 'coordinator://system-prompt') {\n return { contents: [{ uri: req.params.uri, mimeType: 'text/plain', text: coordinatorPrompt }] };\n }\n throw new Error(`Unknown resource: ${req.params.uri}`);\n });\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: ALL_MESH_TOOLS }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const { name, arguments: args } = req.params;\n const a = (args ?? {}) as Record<string, any>;\n try {\n let text: string;\n switch (name) {\n case 'mesh_status': text = await meshStatus(meshCtx, a as any); break;\n case 'mesh_list_nodes': text = await meshListNodes(meshCtx); break;\n case 'mesh_enqueue_task': text = await meshEnqueueTask(meshCtx, a as any); break;\n case 'mesh_view_queue': text = await meshViewQueue(meshCtx, a as any); break;\n case 'mesh_queue_cancel': text = await meshQueueCancel(meshCtx, a as any); break;\n case 'mesh_queue_requeue': text = await meshQueueRequeue(meshCtx, a as any); break;\n case 'mesh_send_task': text = await meshSendTask(meshCtx, a as any); break;\n case 'mesh_read_chat': text = await meshReadChat(meshCtx, a as any); break;\n case 'mesh_read_debug': text = await meshReadDebug(meshCtx, a as any); break;\n case 'mesh_launch_session': text = await meshLaunchSession(meshCtx, a as any); break;\n case 'mesh_git_status': text = await meshGitStatus(meshCtx, a as any); break;\n case 'mesh_read_node_logs': text = await meshReadNodeLogs(meshCtx, a as any); break;\n case 'mesh_fast_forward_node': text = await meshFastForwardNode(meshCtx, a as any); break;\n case 'mesh_restart_daemon': text = await meshRestartDaemon(meshCtx, a as any); break;\n case 'mesh_checkpoint': text = await meshCheckpoint(meshCtx, a as any); break;\n case 'mesh_approve': text = await meshApprove(meshCtx, a as any); break;\n case 'mesh_clone_node': text = await meshCloneNode(meshCtx, a as any); break;\n case 'mesh_remove_node': text = await meshRemoveNode(meshCtx, a as any); break;\n case 'mesh_refine_node': text = await meshRefineNode(meshCtx, a as any); break;\n case 'mesh_refine_batch': text = await meshRefineBatch(meshCtx, a as any); break;\n case 'mesh_refine_config_schema': text = await meshRefineConfigSchema(meshCtx); break;\n case 'mesh_validate_refine_config': text = await meshValidateRefineConfig(meshCtx, a as any); break;\n case 'mesh_suggest_refine_config': text = await meshSuggestRefineConfig(meshCtx, a as any); break;\n case 'mesh_change_impact_config_schema': text = await meshChangeImpactConfigSchema(meshCtx); break;\n case 'mesh_validate_change_impact_config': text = await meshValidateChangeImpactConfig(meshCtx, a as any); break;\n case 'mesh_suggest_change_impact_config': text = await meshSuggestChangeImpactConfig(meshCtx, a as any); break;\n case 'mesh_init': text = await meshInit(meshCtx, a as any); break;\n case 'mesh_refine_plan': text = await meshRefinePlan(meshCtx, a as any); break;\n case 'mesh_cleanup_sessions': text = await meshCleanupSessions(meshCtx, a as any); break;\n case 'mesh_prune_stale_direct': text = await meshPruneStaleDirect(meshCtx, a as any); break;\n case 'mesh_task_history': text = await meshTaskHistory(meshCtx, a as any); break;\n case 'mesh_record_note': text = await meshRecordNote(meshCtx, a as any); break;\n case 'mesh_reconcile_ledger': text = await meshReconcileLedger(meshCtx, a as any); break;\n case 'mesh_mission_upsert': text = await meshMissionUpsert(meshCtx, a as any); break;\n case 'mesh_mission_list': text = await meshMissionList(meshCtx, a as any); break;\n case 'mesh_review_inbox': text = await meshReviewInbox(meshCtx, a as any); break;\n default: return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };\n }\n return { content: [{ type: 'text', text }] };\n } catch (err: any) {\n return { content: [{ type: 'text', text: `Error: ${err?.message ?? String(err)}` }], isError: true };\n }\n });\n\n const stdioTransport = new StdioServerTransport();\n await server.connect(stdioTransport);\n process.stderr.write(`[adhdev-mcp] Server running in ${opts.mode} mesh mode — mesh: ${mesh.name} (${mesh.repoIdentity})\\n`);\n return;\n }\n\n // ── Standard Mode ──────────────────────────────\n\n // Tool availability by mode:\n // both: list_sessions, launch_session, read_chat, send_chat, approve, git_status\n // local: + screenshot (requires P2P / local daemon access)\n const allTools = [\n LIST_DAEMONS_TOOL,\n LIST_SESSIONS_TOOL,\n LAUNCH_SESSION_TOOL,\n STOP_SESSION_TOOL,\n CHECK_PENDING_TOOL,\n READ_CHAT_TOOL,\n READ_CHAT_DEBUG_TOOL,\n SPEC_DEBUG_TOOL,\n SEND_CHAT_TOOL,\n APPROVE_TOOL,\n GIT_STATUS_TOOL,\n GIT_LOG_TOOL,\n GIT_DIFF_TOOL,\n GIT_CHECKPOINT_TOOL,\n GIT_PUSH_TOOL,\n ...(isLocal ? [SCREENSHOT_TOOL] : []),\n ];\n\n const server = new Server(\n { name: 'adhdev-mcp-server', version: '0.9.66' },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: allTools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const { name, arguments: args } = req.params;\n const a = (args ?? {}) as Record<string, any>;\n\n try {\n switch (name) {\n case 'list_daemons': {\n const text = await listDaemons(transport, { format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'list_sessions': {\n const text = await listSessions(transport, { format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'read_chat': {\n const text = await readChat(transport, a);\n return { content: [{ type: 'text', text }] };\n }\n case 'read_chat_debug': {\n const text = await readChatDebug(transport, a as any);\n return { content: [{ type: 'text', text }] };\n }\n case 'spec_debug': {\n const text = await specDebug(transport, a as any);\n return { content: [{ type: 'text', text }] };\n }\n case 'send_chat': {\n const text = await sendChat(transport, { message: a.message, session_id: a.session_id });\n return { content: [{ type: 'text', text }] };\n }\n case 'approve': {\n const action = a.action === 'reject' ? 'reject' : 'approve';\n const text = await approve(transport, { action, session_id: a.session_id });\n return { content: [{ type: 'text', text }] };\n }\n case 'screenshot': {\n const result = await screenshot(transport, { session_id: a.session_id });\n if (result.type === 'image') {\n return {\n content: [{ type: 'image', data: result.data, mimeType: result.mimeType }],\n };\n }\n return { content: [{ type: 'text', text: result.text }] };\n }\n case 'git_status': {\n const text = await gitStatus(transport, { workspace: a.workspace, include_diff: a.include_diff, format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_log': {\n const text = await gitLog(transport, { workspace: a.workspace, limit: a.limit, file: a.file, since: a.since, until: a.until, format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_diff': {\n const text = await gitDiff(transport, { workspace: a.workspace, file: a.file, max_lines: a.max_lines, staged: a.staged, format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_checkpoint': {\n const text = await gitCheckpoint(transport, { workspace: a.workspace, message: a.message, include_untracked: a.include_untracked });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_push': {\n const text = await gitPush(transport, { workspace: a.workspace, remote: a.remote, branch: a.branch });\n return { content: [{ type: 'text', text }] };\n }\n case 'launch_session': {\n const text = await launchSession(transport, {\n type: a.type,\n workspace: a.workspace,\n model: a.model,\n });\n return { content: [{ type: 'text', text }] };\n }\n case 'stop_session': {\n const text = await stopSession(transport, {\n session_id: a.session_id,\n type: a.type,\n });\n return { content: [{ type: 'text', text }] };\n }\n case 'check_pending': {\n const text = await checkPending(transport, { format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n default:\n return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };\n }\n } catch (err: any) {\n return {\n content: [{ type: 'text', text: `Error: ${err?.message ?? String(err)}` }],\n isError: true,\n };\n }\n });\n\n const stdioTransport = new StdioServerTransport();\n await server.connect(stdioTransport);\n process.stderr.write(`[adhdev-mcp] Server running in ${opts.mode} mode.\\n`);\n}\n","/**\n * LocalTransport — HTTP client for standalone daemon at localhost:3847\n */\n\nconst DEFAULT_PORT = 3847;\n\nexport interface LocalTransportOptions {\n port?: number;\n password?: string;\n}\n\nexport class LocalTransport {\n private baseUrl: string;\n private authHeader: string | null;\n\n constructor(opts: LocalTransportOptions = {}) {\n this.baseUrl = `http://localhost:${opts.port ?? DEFAULT_PORT}`;\n this.authHeader = opts.password ? `Bearer ${opts.password}` : null;\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.authHeader) h['Authorization'] = this.authHeader;\n return h;\n }\n\n async getStatus(): Promise<any> {\n const res = await fetch(`${this.baseUrl}/api/v1/status`, { headers: this.headers() });\n if (!res.ok) throw new Error(`Status fetch failed: ${res.status}`);\n return res.json();\n }\n\n async command(type: string, args: Record<string, unknown> = {}): Promise<any> {\n const res = await fetch(`${this.baseUrl}/api/v1/command`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ type, ...args }),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(`Command ${type} failed: ${res.status} ${text}`);\n }\n return res.json();\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.getStatus();\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const FORMAT_PROP = {\n format: {\n type: 'string' as const,\n enum: ['text', 'json'],\n description: \"Output format: 'text' (default, human-readable) or 'json' (structured, for programmatic use).\",\n },\n};\n\nexport const LIST_SESSIONS_TOOL = {\n name: 'list_sessions',\n description: 'List all connected agent sessions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listSessions(\n transport: CommandTransport,\n args: { format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n // Single daemon, status endpoint has full SessionEntry[]\n const status = await transport.getStatus();\n const sessions: any[] = status?.sessions ?? [];\n\n if (asJson) {\n return JSON.stringify({\n sessions: sessions.map((s: any) => ({\n id: s.id,\n type: s.providerType ?? s.type ?? 'unknown',\n label: s.label ?? null,\n status: s.status ?? s.agentStatus ?? null,\n workspace: s.workspace ?? null,\n })),\n }, null, 2);\n }\n\n if (sessions.length === 0) return 'No active sessions.';\n const lines = sessions.map((s: any) => {\n const parts = [`id: ${s.id}`, `type: ${s.providerType ?? s.type ?? 'unknown'}`];\n if (s.label) parts.push(`label: ${s.label}`);\n if (s.status ?? s.agentStatus) parts.push(`status: ${s.status ?? s.agentStatus}`);\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n return parts.join(', ');\n });\n return `Sessions (${sessions.length}):\\n${lines.join('\\n')}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const LIST_DAEMONS_TOOL = {\n name: 'list_daemons',\n description:\n 'List the connected daemon (machine running the ADHDev agent). ' +\n 'Returns the daemon identity extracted from its status report.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listDaemons(\n transport: CommandTransport,\n args: { format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n // Single daemon — extract identity from status\n const status = await transport.getStatus();\n const daemon = {\n id: status?.id ?? status?.instanceId ?? 'standalone',\n hostname: status?.hostname ?? status?.machine?.hostname ?? 'localhost',\n platform: status?.platform ?? status?.machine?.platform ?? 'unknown',\n version: status?.version ?? null,\n sessions: (status?.sessions ?? []).length,\n };\n if (asJson) return JSON.stringify({ daemons: [daemon] }, null, 2);\n return `Daemons (1):\\n id: ${daemon.id}, hostname: ${daemon.hostname}, platform: ${daemon.platform}${daemon.version ? `, version: ${daemon.version}` : ''}, sessions: ${daemon.sessions}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { compactChatPayload, messageContent } from './chat-compact.js';\nimport { annotateRapidReadChatAdvisory, type RapidReadChatAdvisory } from './read-chat-polling-advisory.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const READ_CHAT_TOOL = {\n name: 'read_chat',\n description: 'Read the current chat conversation from an IDE agent session. Returns recent messages.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions). Pass explicitly in local mode when more than one session exists; omitting requires an active target and may fail.',\n },\n limit: {\n type: 'number',\n description: 'Max messages to return (default: 50).',\n },\n compact: {\n type: 'boolean',\n description: 'Opt-in compact mode: filters tool/terminal/system/internal/control/debug/status chatter and returns user-visible messages plus lightweight summary metadata.',\n },\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function readChat(\n transport: CommandTransport,\n args: { session_id?: string; limit?: number; format?: 'text' | 'json'; compact?: boolean },\n): Promise<string> {\n const limit = args.limit ?? 50;\n\n const result = await transport.command('read_chat', {\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n tailLimit: limit,\n });\n const annotated = annotateRapidReadChatAdvisory(result as Record<string, any>, {\n key: `local:${args.session_id ?? '__active__'}`,\n toolName: 'read_chat',\n completionCallbackExpected: false,\n });\n return formatChatResult(annotated, args.session_id, args.format, limit, args.compact);\n}\n\nfunction formatChatResult(result: any, sessionId?: string, format?: 'text' | 'json', limit = 50, compact = false): string {\n if (!result?.success && result?.error) {\n if (format === 'json') return JSON.stringify({ error: result.error, messages: [] }, null, 2);\n return `Error: ${result.error}`;\n }\n\n const messages: any[] = result?.messages ?? result?.data?.messages ?? [];\n const source = { ...result, messages };\n const compactPayload = compact ? compactChatPayload(source, { sessionId: sessionId ?? null, limit }) : null;\n const outputMessages = compact ? compactPayload.messages : messages;\n\n if (format === 'json') {\n if (compact && compactPayload) {\n return JSON.stringify({\n session_id: sessionId ?? null,\n ...compactPayload,\n ...(result?.pollingAdvisory ? { pollingAdvisory: result.pollingAdvisory as RapidReadChatAdvisory } : {}),\n messages: compactPayload.messages.map((m: any) => ({\n role: m.role,\n kind: m.kind ?? null,\n content: messageContent(m),\n timestamp: m.timestamp ?? null,\n // Preserve the dedup flag so consumers know the body lives in `summary`.\n ...(m._sameAsSummary === true ? { _sameAsSummary: true } : {}),\n })),\n }, null, 2);\n }\n return JSON.stringify({\n session_id: sessionId ?? null,\n ...(result?.pollingAdvisory ? { pollingAdvisory: result.pollingAdvisory as RapidReadChatAdvisory } : {}),\n messages: outputMessages.slice(-limit).map((m: any) => ({\n role: m.role,\n kind: m.kind ?? null,\n content: messageContent(m),\n timestamp: m.timestamp ?? null,\n })),\n }, null, 2);\n }\n\n if ((format === 'text' || format === undefined) && compact && compactPayload) {\n const summaryText = typeof compactPayload.summary === 'string' ? compactPayload.summary.trim() : '';\n const tail = outputMessages.slice(-limit);\n const lastIndex = tail.length - 1;\n const lines = tail.flatMap((m: any, idx: number) => {\n const role = m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Agent' : m.role;\n const content = messageContent(m);\n if (idx === lastIndex && (role === 'Agent' || m.role === 'agent') && summaryText && content.trim() === summaryText) {\n return [];\n }\n const truncated = content.length > 500 ? `${content.slice(0, 500)}…` : content;\n return [`[${role}] ${truncated}`];\n });\n if (compactPayload.summary) {\n const truncatedSummary = compactPayload.summary.length > 500\n ? `${compactPayload.summary.slice(0, 500)}…`\n : compactPayload.summary;\n lines.push(`[Summary] ${truncatedSummary}`);\n }\n if (result?.pollingAdvisory) {\n lines.push(`Advisory: ${(result.pollingAdvisory as RapidReadChatAdvisory).message}`);\n }\n return lines.length > 0 ? lines.join('\\n\\n') : 'No messages in chat.';\n }\n\n if (outputMessages.length === 0) {\n return result?.pollingAdvisory\n ? `No messages in chat.\\n\\nAdvisory: ${(result.pollingAdvisory as RapidReadChatAdvisory).message}`\n : 'No messages in chat.';\n }\n const lines = outputMessages.slice(-limit).map((m: any) => {\n const role = m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Agent' : m.role;\n const content = messageContent(m);\n const truncated = content.length > 500 ? `${content.slice(0, 500)}…` : content;\n return `[${role}] ${truncated}`;\n });\n if (result?.pollingAdvisory) {\n lines.push(`Advisory: ${(result.pollingAdvisory as RapidReadChatAdvisory).message}`);\n }\n return lines.join('\\n\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const READ_CHAT_DEBUG_TOOL = {\n name: 'read_chat_debug',\n description: 'Collect a daemon-side chat/parser debug bundle for an agent session without opening the browser UI. Prefer this when terminal/chat diverge or long CLI transcripts parse incorrectly. Defaults to daemon_file delivery and returns a saved bundle locator.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions). Required for reliable routing.',\n },\n agent_type: {\n type: 'string',\n description: 'Optional provider/agent type hint, e.g. hermes-cli, claude-cli, codex-cli.',\n },\n limit: {\n type: 'number',\n description: 'Max read_chat tail messages embedded in the bundle (default: 40).',\n },\n delivery: {\n type: 'string',\n enum: ['daemon_file', 'inline'],\n description: 'daemon_file saves the full sanitized bundle on the daemon and returns a locator; inline returns the sanitized bundle in the MCP response. Default: daemon_file.',\n },\n ...FORMAT_PROP,\n },\n required: ['session_id'],\n },\n};\n\nexport async function readChatDebug(\n transport: CommandTransport,\n args: {\n session_id?: string;\n agent_type?: string;\n limit?: number;\n delivery?: 'daemon_file' | 'inline';\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';\n if (!sessionId) throw new Error('session_id is required');\n\n const tailLimit = args.limit ?? 40;\n const delivery = args.delivery === 'inline' ? 'inline' : 'daemon_file';\n const commandArgs = {\n targetSessionId: sessionId,\n tailLimit,\n ...(args.agent_type ? { agentType: args.agent_type, providerType: args.agent_type } : {}),\n ...(delivery === 'daemon_file' ? { delivery: 'daemon_file' } : {}),\n };\n\n const result = await transport.command('get_chat_debug_bundle', commandArgs);\n\n return formatChatDebugResult(result, { sessionId, delivery, format: args.format });\n}\n\nexport function formatChatDebugResult(\n result: any,\n options: { sessionId: string; delivery: 'daemon_file' | 'inline'; format?: 'text' | 'json' },\n): string {\n if (!result?.success && result?.error) {\n if (options.format === 'json') return JSON.stringify({ success: false, error: result.error }, null, 2);\n return `Error: ${result.error}`;\n }\n\n if (options.format === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n if (result?.delivery === 'daemon_file') {\n const summary = result.summary && typeof result.summary === 'object' ? result.summary : {};\n return [\n 'ADHDev chat debug bundle saved on daemon.',\n `session_id: ${options.sessionId}`,\n `bundle_id: ${String(result.bundleId || '')}`,\n `saved_path: ${String(result.savedPath || '')}`,\n `size_bytes: ${String(result.sizeBytes || '')}`,\n `created_at: ${String(result.createdAt || '')}`,\n `read_chat_status: ${String((summary as any).readChatStatus || '')}`,\n `read_chat_total_messages: ${String((summary as any).readChatTotalMessages ?? '')}`,\n `cli_status: ${String((summary as any).cliStatus || '')}`,\n `cli_message_count: ${String((summary as any).cliMessageCount ?? '')}`,\n ].join('\\n');\n }\n\n if (typeof result?.text === 'string') return result.text;\n if (result?.bundle) return JSON.stringify(result.bundle, null, 2);\n return JSON.stringify(result, null, 2);\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const SPEC_DEBUG_TOOL = {\n name: 'spec_debug',\n description: 'Get current spec state, sections, and state transition history for a spec-driven CLI session (claude-cli, antigravity-cli, etc.). Use to diagnose idle/busy detection issues, inspect section parsing, or verify idle_hold and busy_hold behavior.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions).',\n },\n ...FORMAT_PROP,\n },\n required: ['session_id'],\n },\n};\n\nexport async function specDebug(\n transport: CommandTransport,\n args: {\n session_id?: string;\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';\n if (!sessionId) throw new Error('session_id is required');\n\n const result = await transport.command('get_spec_debug', { targetSessionId: sessionId });\n\n return formatSpecDebugResult(result, { sessionId, format: args.format });\n}\n\nexport function formatSpecDebugResult(\n result: any,\n options: { sessionId: string; format?: 'text' | 'json' },\n): string {\n if (!result?.success) {\n const err = result?.error || 'Unknown error';\n if (options.format === 'json') return JSON.stringify({ success: false, error: err }, null, 2);\n return `Error: ${err}`;\n }\n\n if (options.format === 'json') return JSON.stringify(result, null, 2);\n\n const snap = result.snapshot;\n if (!snap) {\n return [\n `session_id: ${options.sessionId}`,\n `provider_type: ${String(result.providerType || '')}`,\n 'is_spec_provider: false',\n 'No spec debug data available (not a spec-driven provider).',\n ].join('\\n');\n }\n\n const lines: string[] = [];\n lines.push(`session_id: ${options.sessionId}`);\n lines.push(`provider_type: ${String(result.providerType || snap.cliType || '')}`);\n lines.push(`spec_id: ${String(snap.spec_id || '')}`);\n lines.push(`spec_path: ${String(snap.specPath || '')}`);\n lines.push(`current_state: ${snap.current_state ? `${snap.current_state.id} (${snap.current_state.label})` : 'none'}`);\n lines.push(`idle_hold_pending: ${String(snap.idleHoldPending ?? false)}`);\n lines.push(`last_busy_at: ${snap.lastBusyAt ? new Date(snap.lastBusyAt).toISOString() : 'never'}`);\n lines.push(`exited: ${String(snap.exited ?? false)}`);\n\n if (snap.current_modal) {\n lines.push(`current_modal: ${JSON.stringify(snap.current_modal)}`);\n }\n\n // Sections — full raw text (this is a debugging surface; do NOT truncate or\n // collapse newlines, so the exact text the FSM regexes match against is\n // visible). Each section is fenced and prefixed with its line count.\n if (snap.sections && typeof snap.sections === 'object') {\n lines.push('');\n lines.push('## Sections');\n for (const [id, text] of Object.entries(snap.sections as Record<string, string>)) {\n const raw = String(text ?? '');\n const lineCount = raw.length === 0 ? 0 : raw.split('\\n').length;\n lines.push('');\n lines.push(`### section: ${id} (${lineCount} lines, ${raw.length} chars)`);\n lines.push('```');\n lines.push(raw);\n lines.push('```');\n }\n }\n\n // State history (most recent first) — now includes the fired transition\n // (`via`) and the per-condition rule evaluation (`matchedRules`), so you can\n // see WHICH regex/time-gate fired and, for regex rules, the matched text.\n const history = Array.isArray(snap.stateHistory) ? snap.stateHistory : [];\n if (history.length > 0) {\n lines.push('');\n lines.push('## State History (newest first)');\n const now = Date.now();\n for (const entry of [...history].reverse().slice(0, 20)) {\n const agoMs = now - entry.at;\n const ago = agoMs < 2000 ? `${agoMs}ms ago` : `${(agoMs / 1000).toFixed(1)}s ago`;\n const dur = entry.durationMs > 0 ? ` held ${entry.durationMs}ms` : '';\n const via = entry.via ? ` via ${entry.via}` : '';\n lines.push(` ${String(entry.stateId).padEnd(18)} ${ago}${dur}${via}`);\n const rules = Array.isArray(entry.matchedRules) ? entry.matchedRules : [];\n for (const rule of rules) {\n lines.push(` ${String(rule)}`);\n }\n }\n }\n\n // PTY event timeline (input we injected / output the PTY printed / resize /\n // cursor moves) — correlate by timestamp with the State History above to see\n // what input/output preceded each status transition.\n const timeline = Array.isArray(snap.eventTimeline) ? snap.eventTimeline : [];\n if (timeline.length > 0) {\n lines.push('');\n lines.push('## Event Timeline (oldest first)');\n const now = Date.now();\n const arrow: Record<string, string> = {\n input: '→ in ', output: '← out', resize: '⇲ size', cursor: '⌖ cur', spawn: '⏻ spawn', exit: '⏹ exit',\n };\n for (const ev of timeline.slice(-120)) {\n const agoMs = now - (ev.ts ?? now);\n const ago = agoMs < 2000 ? `${agoMs}ms` : `${(agoMs / 1000).toFixed(1)}s`;\n const tag = arrow[String(ev.kind)] ?? String(ev.kind);\n const bytes = typeof ev.bytes === 'number' ? ` [${ev.bytes}b]` : '';\n lines.push(` -${ago.padStart(6)} ${tag}${bytes} ${String(ev.content ?? '')}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const SEND_CHAT_TOOL = {\n name: 'send_chat',\n description: 'Send a message to an IDE agent session.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n message: {\n type: 'string',\n description: 'The message to send to the agent.',\n },\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions). Omit to use the active session.',\n },\n },\n required: ['message'],\n },\n};\n\nexport async function sendChat(\n transport: CommandTransport,\n args: { message: string; session_id?: string },\n): Promise<string> {\n if (!args.message?.trim()) throw new Error('message is required');\n\n const result = await transport.command('send_chat', {\n message: args.message,\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n if (result?.success === false) return `Error: ${result.error ?? 'send_chat failed'}`;\n return 'Message sent.';\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const APPROVE_TOOL = {\n name: 'approve',\n description: 'Approve or reject a pending agent action (e.g. file write, command execution).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n action: {\n type: 'string',\n enum: ['approve', 'reject'],\n description: 'Whether to approve or reject the pending action.',\n },\n session_id: {\n type: 'string',\n description: 'Target session ID. Omit to use the active session.',\n },\n },\n required: ['action'],\n },\n};\n\nexport async function approve(\n transport: CommandTransport,\n args: { action: 'approve' | 'reject'; session_id?: string },\n): Promise<string> {\n const action = args.action === 'reject' ? 'reject' : 'approve';\n\n const result = await transport.command('resolve_action', {\n action,\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n if (result?.success === false) return `Error: ${result.error ?? 'resolve_action failed'}`;\n return `Action ${action}d.`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const SCREENSHOT_TOOL = {\n name: 'screenshot',\n description:\n 'Capture a screenshot of the current IDE window. Returns the image.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID. Omit to use the active session.',\n },\n },\n required: [],\n },\n};\n\nexport async function screenshot(\n transport: CommandTransport,\n args: { session_id?: string },\n): Promise<{ type: 'image'; data: string; mimeType: string } | { type: 'text'; text: string }> {\n const result: any = await transport.command('screenshot', {\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n\n if (result?.success === false) {\n return { type: 'text', text: `Error: ${result.error ?? 'screenshot failed'}` };\n }\n\n const b64: string | undefined = result?.base64 ?? result?.screenshot ?? result?.result;\n if (!b64) {\n return { type: 'text', text: 'Screenshot captured but no image data returned.' };\n }\n\n const mimeType = result?.format === 'png' ? 'image/png' : 'image/webp';\n return { type: 'image', data: b64, mimeType };\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const GIT_STATUS_TOOL = {\n name: 'git_status',\n description: 'Get git repository status for a workspace on the daemon machine.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n include_diff: {\n type: 'boolean',\n description: 'Include changed file list (default: true).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitStatus(\n transport: CommandTransport,\n args: { workspace: string; include_diff?: boolean; format?: 'text' | 'json' },\n): Promise<string> {\n let diffSummary: any;\n\n const statusResult = await transport.command('git_status', {\n workspace: args.workspace,\n });\n const status: any = statusResult?.status ?? statusResult;\n\n if (args.include_diff !== false) {\n const diffResult = await transport.command('git_diff_summary', {\n workspace: args.workspace,\n });\n diffSummary = diffResult?.diffSummary ?? diffResult;\n }\n\n if (status?.success === false || status?.reason) {\n const msg = status?.error ?? status?.reason ?? 'unknown';\n if (args.format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git error: ${msg}`;\n }\n if (!status?.isGitRepo) {\n if (args.format === 'json') return JSON.stringify({ error: `Not a git repository: ${args.workspace}` }, null, 2);\n return `Not a git repository: ${args.workspace}`;\n }\n\n if (args.format === 'json') {\n const files = diffSummary?.files?.map((f: any) => ({\n path: f.path,\n old_path: f.oldPath ?? null,\n status: f.status ?? 'M',\n insertions: f.insertions ?? 0,\n deletions: f.deletions ?? 0,\n })) ?? [];\n return JSON.stringify({\n branch: status.branch ?? null,\n head_commit: status.headCommit ?? null,\n head_message: status.headMessage ?? null,\n ahead: status.ahead ?? 0,\n behind: status.behind ?? 0,\n staged: status.staged ?? 0,\n modified: status.modified ?? 0,\n untracked: status.untracked ?? 0,\n deleted: status.deleted ?? 0,\n stash_count: status.stashCount ?? 0,\n has_conflicts: status.hasConflicts ?? false,\n dirty: status.dirty ?? false,\n changed_files: files,\n total_insertions: diffSummary?.totalInsertions ?? 0,\n total_deletions: diffSummary?.totalDeletions ?? 0,\n }, null, 2);\n }\n\n const lines: string[] = [];\n if (status.branch) lines.push(`Branch: ${status.branch}`);\n if (status.headCommit) {\n lines.push(`HEAD: ${status.headCommit.slice(0, 7)}${status.headMessage ? ` — ${status.headMessage.slice(0, 80)}` : ''}`);\n }\n if (status.ahead > 0) lines.push(`Ahead: ${status.ahead}`);\n if (status.behind > 0) lines.push(`Behind: ${status.behind}`);\n if (status.staged > 0) lines.push(`Staged: ${status.staged}`);\n if (status.modified > 0) lines.push(`Modified: ${status.modified}`);\n if (status.untracked > 0) lines.push(`Untracked: ${status.untracked}`);\n if (status.deleted > 0) lines.push(`Deleted: ${status.deleted}`);\n if (status.stashCount > 0) lines.push(`Stashes: ${status.stashCount}`);\n if (status.hasConflicts) lines.push('Conflicts: YES');\n if (!status.dirty) lines.push('Working tree: clean');\n\n if (diffSummary?.files?.length > 0) {\n lines.push('');\n lines.push(`Changed files (${diffSummary.files.length}):`);\n for (const f of diffSummary.files.slice(0, 20)) {\n lines.push(` ${f.status ?? 'M'} ${f.path}${f.oldPath ? ` (was ${f.oldPath})` : ''}${f.insertions || f.deletions ? ` +${f.insertions ?? 0}/-${f.deletions ?? 0}` : ''}`);\n }\n if (diffSummary.files.length > 20) lines.push(` … and ${diffSummary.files.length - 20} more`);\n if (diffSummary.totalInsertions || diffSummary.totalDeletions) {\n lines.push(`Total: +${diffSummary.totalInsertions ?? 0}/-${diffSummary.totalDeletions ?? 0}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const GIT_LOG_TOOL = {\n name: 'git_log',\n description:\n 'Get commit history for a workspace. Shows hash, message, author, and date for recent commits. ' +\n 'Use this to track what changes an agent has made, verify checkpoint commits, or understand project history.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n limit: {\n type: 'number',\n description: 'Max commits to return (default: 20, max: 100).',\n },\n file: {\n type: 'string',\n description: 'Filter history to commits that touched this repo-relative file path (optional).',\n },\n since: {\n type: 'string',\n description: 'Only commits after this date (ISO 8601 or git date string, optional).',\n },\n until: {\n type: 'string',\n description: 'Only commits before this date (ISO 8601 or git date string, optional).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitLog(\n transport: CommandTransport,\n args: {\n workspace: string;\n limit?: number;\n file?: string;\n since?: string;\n until?: string;\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const limit = Math.max(1, Math.min(100, args.limit ?? 20));\n\n let raw: any = await transport.command('git_log', {\n workspace: args.workspace,\n limit,\n ...(args.file ? { path: args.file } : {}),\n ...(args.since ? { since: args.since } : {}),\n ...(args.until ? { until: args.until } : {}),\n });\n raw = raw?.log ?? raw;\n\n if (raw?.success === false || raw?.reason) {\n const msg = raw?.error ?? raw?.reason ?? 'unknown';\n if (args.format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git log error: ${msg}`;\n }\n\n if (!raw?.isGitRepo) {\n const msg = `Not a git repository: ${args.workspace}`;\n if (args.format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return msg;\n }\n\n const entries: any[] = raw?.entries ?? [];\n\n if (args.format === 'json') {\n return JSON.stringify({\n workspace: raw.workspace,\n branch: raw.branch ?? null,\n entries: entries.map((e) => ({\n commit: e.commit,\n short: e.commit?.slice(0, 7),\n message: e.message,\n author: e.authorName ?? null,\n author_email: e.authorEmail ?? null,\n authored_at: e.authoredAt ? new Date(e.authoredAt).toISOString() : null,\n })),\n total: entries.length,\n truncated: raw.truncated ?? false,\n }, null, 2);\n }\n\n if (entries.length === 0) return 'No commits found.';\n\n const lines = entries.map((e) => {\n const hash = e.commit?.slice(0, 7) ?? '???????';\n const date = e.authoredAt ? new Date(e.authoredAt).toISOString().slice(0, 10) : '';\n const author = e.authorName ? ` (${e.authorName})` : '';\n return `${hash} ${date}${author} ${e.message}`;\n });\n\n const header = `Commits (${entries.length}${raw.truncated ? ', truncated' : ''}):`;\n return `${header}\\n${lines.join('\\n')}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const GIT_DIFF_TOOL = {\n name: 'git_diff',\n description:\n 'Get the actual diff content for changed files in a workspace. ' +\n 'Without a specific file, returns diffs for up to 5 changed files. ' +\n 'Use this to review what an agent actually changed — file names alone (from git_status) are not enough for code review.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n file: {\n type: 'string',\n description: 'Specific repo-relative file path to diff (optional — if omitted, returns top 5 changed files).',\n },\n max_lines: {\n type: 'number',\n description: 'Max diff lines per file before truncating (default: 300).',\n },\n staged: {\n type: 'boolean',\n description: 'Show staged changes instead of unstaged (default: false).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\ninterface FileDiffResult {\n path: string;\n old_path?: string | null;\n status?: string;\n diff: string;\n truncated: boolean;\n binary: boolean;\n error?: string;\n}\n\nexport async function gitDiff(\n transport: CommandTransport,\n args: {\n workspace: string;\n file?: string;\n max_lines?: number;\n staged?: boolean;\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const maxLines = Math.max(10, Math.min(2000, args.max_lines ?? 300));\n const staged = args.staged ?? false;\n\n return localGitDiff(transport, args.workspace, args.file, maxLines, staged, args.format);\n}\n\nasync function localGitDiff(\n transport: CommandTransport,\n workspace: string,\n file: string | undefined,\n maxLines: number,\n staged: boolean,\n format: 'text' | 'json' | undefined,\n): Promise<string> {\n if (file) {\n const raw = await transport.command('git_diff_file', { workspace, path: file, staged });\n const d = raw?.diff ?? raw;\n\n if (d?.success === false || d?.reason) {\n const msg = d?.error ?? d?.reason ?? 'unknown';\n if (format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git diff error: ${msg}`;\n }\n\n const lines = (d?.diff ?? '').split('\\n');\n const truncated = lines.length > maxLines;\n const result = {\n files: [{\n path: file,\n diff: truncated ? lines.slice(0, maxLines).join('\\n') + '\\n... (truncated)' : (d?.diff ?? ''),\n truncated,\n binary: d?.binary ?? false,\n }],\n total_files: 1,\n shown_files: 1,\n truncated,\n };\n return formatDiffResult(result, format);\n }\n\n // No specific file: get summary then fetch top 5\n const summaryRaw = await transport.command('git_diff_summary', { workspace, staged });\n const summary = summaryRaw?.diffSummary ?? summaryRaw;\n\n if (summary?.success === false || summary?.reason) {\n const msg = summary?.error ?? summary?.reason ?? 'unknown';\n if (format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git diff error: ${msg}`;\n }\n\n if (!summary?.isGitRepo) {\n const msg = `Not a git repository: ${workspace}`;\n if (format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return msg;\n }\n\n const files: any[] = summary?.files ?? [];\n if (files.length === 0) {\n if (format === 'json') return JSON.stringify({ files: [], total_files: 0, shown_files: 0, truncated: false }, null, 2);\n return 'No changed files.';\n }\n\n const topFiles = files.slice(0, 5);\n const fileDiffs: FileDiffResult[] = await Promise.all(\n topFiles.map(async (f: any): Promise<FileDiffResult> => {\n try {\n const raw = await transport.command('git_diff_file', { workspace, path: f.path, staged });\n const d = raw?.diff ?? raw;\n const lines = (d?.diff ?? '').split('\\n');\n const trunc = lines.length > maxLines;\n return {\n path: f.path,\n old_path: f.oldPath ?? null,\n status: f.status ?? 'M',\n diff: trunc ? lines.slice(0, maxLines).join('\\n') + '\\n... (truncated)' : (d?.diff ?? ''),\n truncated: trunc,\n binary: d?.binary ?? false,\n };\n } catch {\n return { path: f.path, diff: '', truncated: false, binary: false, error: 'fetch failed' };\n }\n }),\n );\n\n return formatDiffResult({\n files: fileDiffs,\n total_files: files.length,\n shown_files: topFiles.length,\n truncated: files.length > 5,\n }, format);\n}\n\nfunction formatDiffResult(result: any, format: 'text' | 'json' | undefined): string {\n if (format === 'json') return JSON.stringify(result, null, 2);\n\n const files: FileDiffResult[] = result?.files ?? [];\n if (files.length === 0) return 'No changed files.';\n\n const parts: string[] = [];\n const totalShown = result?.shown_files ?? files.length;\n const totalAll = result?.total_files ?? files.length;\n if (totalAll > totalShown) {\n parts.push(`Showing ${totalShown} of ${totalAll} changed files:\\n`);\n }\n\n for (const f of files) {\n const header = `--- ${f.path}${f.old_path ? ` (was ${f.old_path})` : ''} ---`;\n if (f.error) {\n parts.push(`${header}\\n(error: ${f.error})\\n`);\n } else if (f.binary) {\n parts.push(`${header}\\n(binary file)\\n`);\n } else if (!f.diff) {\n parts.push(`${header}\\n(no diff)\\n`);\n } else {\n parts.push(`${header}\\n${f.diff}${f.truncated ? '' : '\\n'}`);\n }\n }\n\n return parts.join('\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const GIT_CHECKPOINT_TOOL = {\n name: 'git_checkpoint',\n description:\n 'Create a checkpoint commit in a workspace. ' +\n 'Stages all tracked changes (or all files including untracked) and commits with a prefixed message. ' +\n 'Use this to save progress before a risky operation, or to create a restore point the orchestrator can reference.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n message: {\n type: 'string',\n description: 'Checkpoint message (max 200 chars). Will be prefixed with \"adhdev: checkpoint \".',\n },\n include_untracked: {\n type: 'boolean',\n description: 'Also stage and commit untracked files (default: false).',\n },\n },\n required: ['workspace', 'message'],\n },\n};\n\nexport async function gitCheckpoint(\n transport: CommandTransport,\n args: {\n workspace: string;\n message: string;\n include_untracked?: boolean;\n },\n): Promise<string> {\n const message = args.message?.trim();\n if (!message) return 'Error: message is required';\n if (message.length > 200) return 'Error: message must be 200 characters or fewer';\n\n let raw: any = await transport.command('git_checkpoint', {\n workspace: args.workspace,\n message,\n includeUntracked: args.include_untracked ?? false,\n });\n raw = raw?.checkpoint ?? raw;\n\n if (raw?.success === false || raw?.reason) {\n const msg = raw?.error ?? raw?.reason ?? 'unknown';\n if (msg.includes('Nothing to commit') || msg.includes('nothing to commit')) {\n return 'Nothing to commit — working tree is clean.';\n }\n return `Git checkpoint error: ${msg}`;\n }\n\n const commit = raw?.commit?.slice(0, 7) ?? '???????';\n const fullMsg = raw?.message ?? `adhdev: checkpoint ${message}`;\n return `Checkpoint created: ${commit} — ${fullMsg}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const GIT_PUSH_TOOL = {\n name: 'git_push',\n description:\n 'Push a branch to a remote repository on the daemon machine. ' +\n 'If the branch has no upstream configured, sets it automatically. ' +\n 'Key for parallel multi-machine workflows: after git_checkpoint, push each machine\\'s ' +\n 'branch to origin so changes are available for PR/review.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n remote: {\n type: 'string',\n description: 'Remote name (default: \"origin\").',\n },\n branch: {\n type: 'string',\n description: 'Branch to push (default: current branch).',\n },\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitPush(\n transport: CommandTransport,\n args: {\n workspace: string;\n remote?: string;\n branch?: string;\n },\n): Promise<string> {\n let raw: any = await transport.command('git_push', {\n workspace: args.workspace,\n remote: args.remote ?? 'origin',\n ...(args.branch ? { branch: args.branch } : {}),\n });\n raw = raw?.push ?? raw;\n\n if (raw?.success === false || raw?.reason) {\n const msg = raw?.error ?? raw?.reason ?? 'unknown';\n return `Git push error: ${msg}`;\n }\n\n const branch = raw?.branch ?? args.branch ?? '(current)';\n const remote = raw?.remote ?? args.remote ?? 'origin';\n const newBranch = raw?.newBranch ? ' [new branch]' : '';\n const output = raw?.output ? `\\n${raw.output}` : '';\n\n return `Pushed ${branch} → ${remote}${newBranch}${output}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const LAUNCH_SESSION_TOOL = {\n name: 'launch_session',\n description:\n 'Launch a new agent session on the daemon. Supports CLI agents (e.g. hermes-cli, claude-cli, gemini-cli), ACP agents (e.g. claude-acp), and IDEs (e.g. cursor, vscode).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n type: {\n type: 'string',\n description:\n 'Provider type to launch. CLI examples: hermes-cli, claude-cli, gemini-cli. ACP examples: claude-acp. IDE examples: cursor, vscode.',\n },\n workspace: {\n type: 'string',\n description: 'Working directory for the session. Defaults to the daemon default workspace.',\n },\n model: {\n type: 'string',\n description: 'Model override for ACP agents (e.g. claude-opus-4-7).',\n },\n },\n required: ['type'],\n },\n};\n\nexport async function launchSession(\n transport: CommandTransport,\n args: { type: string; workspace?: string; model?: string },\n): Promise<string> {\n const isCliOrAcp =\n args.type.includes('-cli') || args.type.includes('-acp') || args.type === 'codex';\n const commandType = isCliOrAcp ? 'launch_cli' : 'launch_ide';\n const payload: Record<string, unknown> = isCliOrAcp\n ? { cliType: args.type, dir: args.workspace ?? '~', ...(args.model ? { model: args.model } : {}) }\n : { ideType: args.type, enableCdp: true };\n const result = await transport.command(commandType, payload);\n if (result?.success === false) return `Error: ${result.error ?? 'launch failed'}`;\n const id = result?.id ?? result?.sessionId;\n return id ? `Session launched. id: ${id}, type: ${args.type}` : `Launched: ${JSON.stringify(result)}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const STOP_SESSION_TOOL = {\n name: 'stop_session',\n description:\n 'Stop a running agent session. For CLI agents (hermes-cli, claude-cli, etc.) this sends a graceful stop signal. ' +\n 'Use list_sessions to find the session_id.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Session ID to stop (from list_sessions).',\n },\n type: {\n type: 'string',\n description:\n 'Provider type (e.g. hermes-cli, claude-cli). Auto-resolved from session_id if omitted.',\n },\n },\n required: ['session_id'],\n },\n};\n\nexport async function stopSession(\n transport: CommandTransport,\n args: { session_id: string; type?: string },\n): Promise<string> {\n let resolvedType = args.type;\n\n // Auto-resolve type from session status if not provided\n if (!resolvedType) {\n const status = await transport.getStatus();\n const session = (status?.sessions ?? []).find((s: any) => s.id === args.session_id);\n resolvedType = session?.providerType ?? session?.type;\n }\n\n if (!resolvedType) {\n return `Error: could not resolve session type for ${args.session_id}. Pass type= explicitly.`;\n }\n\n const result = await transport.command('stop_cli', {\n targetSessionId: args.session_id,\n cliType: resolvedType,\n });\n if (result?.success === false) return `Error: ${result.error ?? 'stop failed'}`;\n return `Session ${args.session_id} stopped.`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const CHECK_PENDING_TOOL = {\n name: 'check_pending',\n description:\n 'List all agent sessions currently waiting for user approval (tool-use confirmation). ' +\n 'Returns session ID, daemon ID, workspace, and the approval prompt message when available. ' +\n 'Use approve() with the session_id to approve or reject.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function checkPending(\n transport: CommandTransport,\n args: { format?: 'text' | 'json' },\n): Promise<string> {\n const status = await transport.getStatus();\n const sessions: any[] = status?.sessions ?? [];\n\n const pending = sessions.filter(\n (s) => s.status === 'waiting_approval' || s.agentStatus === 'waiting_approval',\n );\n\n if (args.format === 'json') {\n return JSON.stringify({\n pending: pending.map((s) => ({\n session_id: s.id,\n workspace: s.workspace ?? null,\n type: s.providerType ?? null,\n modal_message: s.activeChat?.activeModal?.message ?? null,\n buttons: s.activeChat?.activeModal?.buttons ?? [],\n })),\n }, null, 2);\n }\n\n if (pending.length === 0) return 'No sessions waiting for approval.';\n const lines = pending.map((s) => {\n const modal = s.activeChat?.activeModal;\n const parts = [`session_id: ${s.id}`];\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n if (s.providerType) parts.push(`type: ${s.providerType}`);\n if (modal?.message) parts.push(`prompt: ${modal.message}`);\n if (modal?.buttons?.length) parts.push(`buttons: ${modal.buttons.join(', ')}`);\n return parts.join('\\n ');\n });\n return `Pending approvals (${pending.length}):\\n\\n${lines.join('\\n\\n')}`;\n}\n"],"mappings":"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","names":["now","import_daemon_core","import_daemon_core","slice","result","lines","os","server","stdioTransport"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/transports/ipc.ts","../src/tools/chat-compact.ts","../src/tools/mesh-tools-internal.ts","../src/tools/mesh-tool-shared.ts","../src/tools/mesh-session-helpers.ts","../src/tools/mesh-node-identity.ts","../src/tools/mesh-tool-schemas.ts","../src/tools/mesh-compact.ts","../src/tools/mesh-queue-helpers.ts","../src/tools/read-chat-polling-advisory.ts","../src/tools/mesh-tools-status.ts","../src/tools/mesh-tools-queue.ts","../src/tools/mesh-tools-mission.ts","../src/tools/mesh-tools-session.ts","../src/tools/mesh-tools-git.ts","../src/tools/mesh-tools-refine.ts","../src/help.ts","../src/server.ts","../src/transports/local.ts","../src/tools/list-sessions.ts","../src/tools/list-daemons.ts","../src/tools/read-chat.ts","../src/tools/read-chat-debug.ts","../src/tools/spec-debug.ts","../src/tools/send-chat.ts","../src/tools/approve.ts","../src/tools/screenshot.ts","../src/tools/git-status.ts","../src/tools/git-log.ts","../src/tools/git-diff.ts","../src/tools/git-checkpoint.ts","../src/tools/git-push.ts","../src/tools/launch-session.ts","../src/tools/stop-session.ts","../src/tools/check-pending.ts"],"sourcesContent":["/**\n * @adhdev/mcp-server — CLI entry point\n *\n * Usage:\n * npx @adhdev/mcp-server # local mode (localhost:3847)\n * npx @adhdev/mcp-server --port 4000 # custom port\n * npx @adhdev/mcp-server --mode ipc --repo-mesh mesh_xxx # cloud daemon IPC mode\n */\n\nimport { buildMcpHelpText } from './help.js';\nimport { startMcpServer } from './server.js';\n\nexport function parseArgs(argv: string[], env: NodeJS.ProcessEnv = process.env): {\n mode: 'local' | 'ipc';\n port?: number;\n password?: string;\n meshId?: string;\n} {\n const args = argv.slice(2);\n let port: number | undefined;\n let password: string | undefined;\n let meshId: string | undefined;\n let explicitMode: 'local' | 'ipc' | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--mode' && args[i + 1]) {\n const value = String(args[++i]).trim();\n if (value === 'local' || value === 'ipc') explicitMode = value;\n } else if (arg?.startsWith('--mode=')) {\n const value = arg.slice('--mode='.length).trim();\n if (value === 'local' || value === 'ipc') explicitMode = value;\n } else if (arg === '--port' && args[i + 1]) {\n port = Number(args[++i]);\n } else if (arg?.startsWith('--port=')) {\n port = Number(arg.slice('--port='.length));\n } else if (arg === '--password' && args[i + 1]) {\n password = args[++i];\n } else if ((arg === '--repo-mesh' || arg === '--mesh') && args[i + 1]) {\n meshId = args[++i];\n } else if (arg?.startsWith('--repo-mesh=')) {\n meshId = arg.slice('--repo-mesh='.length);\n } else if (arg === '--help' || arg === '-h') {\n printHelp();\n process.exit(0);\n }\n }\n\n // Also accept env vars\n if (!password && env.ADHDEV_PASSWORD) password = env.ADHDEV_PASSWORD;\n if (!meshId && env.ADHDEV_MESH_ID) meshId = env.ADHDEV_MESH_ID;\n if (!explicitMode && env.ADHDEV_MCP_TRANSPORT) {\n const value = env.ADHDEV_MCP_TRANSPORT.trim();\n if (value === 'local' || value === 'ipc') explicitMode = value;\n }\n\n const mode = explicitMode || (meshId && env.ADHDEV_INLINE_MESH ? 'ipc' : 'local');\n return { mode, port, password, meshId };\n}\n\nfunction printHelp(): void {\n console.error(buildMcpHelpText());\n}\n\nstartMcpServer(parseArgs(process.argv)).catch((err) => {\n process.stderr.write(`[adhdev-mcp] Fatal: ${err?.message ?? err}\\n`);\n process.exit(1);\n});\n","/**\n * IpcTransport — WebSocket client for the cloud daemon's local IPC server.\n *\n * This is used by Repo Mesh coordinators launched by `adhdev daemon` (cloud\n * daemon). They run on the same machine as the daemon, but not against the\n * standalone HTTP server at localhost:3847.\n *\n * Uses a persistent connection pool (one WS per port+path) so concurrent\n * mesh tool calls share a single connection instead of opening a new socket\n * per request.\n */\n\nconst DEFAULT_IPC_PORT = 19222;\nconst DEFAULT_IPC_PATH = '/ipc';\nconst DEFAULT_IPC_COMMAND_TIMEOUT_MS = 15_000;\n// IPC (layer-1) is the OUTERMOST deadline. For a REMOTE node the coordinator wraps\n// the verb in `mesh_relay_command` (120s here), so getTimeoutMs() already covers the\n// relay/responder budget. But for a LOCAL node commandForNode() sends the BARE verb\n// (transport.command), so the only deadline is this table — and any heavy verb missing\n// an entry fell back to the 15s default and false-timed-out while the responder was\n// still working (e.g. a local `clone_mesh_node` worktree create). Entries below keep\n// IPC ≥ the relay budget (daemon-cloud resultTimeoutForCommand) ≥ the responder budget.\nconst IPC_COMMAND_TIMEOUTS_MS: Record<string, number> = {\n mesh_relay_command: 120_000,\n agent_command: 30_000,\n git_status: 45_000,\n git_diff_summary: 45_000,\n fast_forward_mesh_node: 120_000,\n mesh_status: 120_000,\n // Heavy repo-mutating worktree ops (relay budgets: clone 90s, remove 60s). A local\n // clone synchronously creates a worktree (~30s) plus a bounded setup-wait (~14s);\n // 120s leaves headroom and matches the relay-wrapped remote path.\n clone_mesh_node: 120_000,\n remove_mesh_node: 60_000,\n // A5: plan_mesh_refine_node is the SYNCHRONOUS refine dry-run — it runs several git\n // probes (status/merge-tree/submodule) inline before replying, which can approach the\n // 15s default on a slow (Windows) host. 45s defensively, matching git_status/diff.\n plan_mesh_refine_node: 45_000,\n // A2: refine_mesh_node / batch_refine_mesh_nodes are async-job-ack (the responder\n // returns { async:true, status:'accepted' } immediately and works in the background),\n // so 15s already suffices. 30s is a defensive floor guarding a future sync-dry-run\n // regression; it is intentionally BELOW the relay 90s budget because the synchronous\n // ack reply is sub-second and never bounded by the relay deadline.\n refine_mesh_node: 30_000,\n batch_refine_mesh_nodes: 30_000,\n};\n\n// WS readyState constants (same as browser)\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\n\ninterface PendingRequest {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst POOL_IDLE_EVICT_MS = 5 * 60_000; // evict connections idle for >5 min\nconst POOL_MAX_AGE_MS = 10 * 60_000; // force-refresh connections older than 10 min\n\ninterface PooledConnection {\n ws: WebSocket;\n ready: boolean;\n commandQueue: Array<{ type: string; args: Record<string, unknown>; requestId: string }>;\n pending: Map<string, PendingRequest>;\n lastUsedAt: number;\n createdAt: number;\n}\n\nconst connectionPool = new Map<string, PooledConnection>();\n\nfunction buildRequestId(): string {\n return `mcp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function getTimeoutMs(type: string, nestedCommand: string): number {\n return Math.max(\n IPC_COMMAND_TIMEOUTS_MS[type] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\n IPC_COMMAND_TIMEOUTS_MS[nestedCommand] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\n );\n}\n\nfunction getOrCreateConnection(\n WebSocketCtor: typeof WebSocket,\n url: string,\n): PooledConnection {\n const existing = connectionPool.get(url);\n if (existing) {\n const { readyState } = existing.ws;\n const now = Date.now();\n const isAlive = readyState === WS_CONNECTING || readyState === WS_OPEN;\n const isIdle = now - existing.lastUsedAt > POOL_IDLE_EVICT_MS && existing.pending.size === 0;\n const isTooOld = now - existing.createdAt > POOL_MAX_AGE_MS && existing.pending.size === 0;\n if (isAlive && !isIdle && !isTooOld) {\n return existing;\n }\n if (isAlive && (isIdle || isTooOld)) {\n try { existing.ws.close(); } catch { /* noop */ }\n connectionPool.delete(url);\n }\n // Stale — remove and recreate\n connectionPool.delete(url);\n }\n\n const now = Date.now();\n const conn: PooledConnection = {\n ws: new WebSocketCtor(url),\n ready: false,\n commandQueue: [],\n pending: new Map(),\n lastUsedAt: now,\n createdAt: now,\n };\n connectionPool.set(url, conn);\n\n const drainQueue = () => {\n conn.ready = true;\n for (const { type, args, requestId } of conn.commandQueue) {\n conn.ws.send(JSON.stringify({ type: 'ext:command', payload: { command: type, args, requestId } }));\n }\n conn.commandQueue = [];\n };\n\n let tornDown = false;\n const teardown = (error: Error) => {\n if (tornDown) return;\n tornDown = true;\n connectionPool.delete(url);\n conn.ready = false;\n for (const [, req] of conn.pending) {\n clearTimeout(req.timer);\n req.reject(error);\n }\n conn.pending.clear();\n conn.commandQueue = [];\n };\n\n conn.ws.addEventListener('open', () => {\n conn.ws.send(JSON.stringify({\n type: 'ext:register',\n payload: {\n ideType: 'mcp-server',\n ideVersion: '1.0.0',\n extensionVersion: '1.0.0',\n instanceId: `mcp-server-${process.pid}`,\n machineId: 'mcp-server',\n workspaceFolders: [],\n },\n }));\n });\n\n conn.ws.addEventListener('message', (event: MessageEvent) => {\n try {\n const raw = typeof event.data === 'string' ? event.data : String(event.data);\n const msg = JSON.parse(raw);\n if (msg?.type === 'daemon:welcome') {\n drainQueue();\n return;\n }\n if (msg?.type !== 'ext:command_result') return;\n const req = conn.pending.get(msg?.payload?.requestId);\n if (!req) return;\n conn.pending.delete(msg.payload.requestId);\n clearTimeout(req.timer);\n const payload = msg.payload;\n if (payload?.success === false) {\n req.reject(new Error(payload.error || 'Daemon IPC command failed'));\n } else {\n req.resolve(payload?.result ?? payload);\n }\n } catch {\n // Ignore non-JSON or unrelated daemon messages.\n }\n });\n\n conn.ws.addEventListener('error', () => {\n teardown(new Error(`Cannot connect to daemon IPC at ${url}`));\n });\n\n conn.ws.addEventListener('close', () => {\n teardown(new Error(`Daemon IPC connection closed: ${url}`));\n });\n\n return conn;\n}\n\nexport interface IpcTransportOptions {\n port?: number;\n path?: string;\n}\n\nexport class IpcTransport {\n private port: number;\n private path: string;\n\n constructor(opts: IpcTransportOptions = {}) {\n this.port = opts.port ?? DEFAULT_IPC_PORT;\n this.path = opts.path || DEFAULT_IPC_PATH;\n }\n\n async ping(): Promise<boolean> {\n try {\n const res = await fetch(`http://127.0.0.1:${this.port}/health`);\n return res.ok;\n } catch {\n return false;\n }\n }\n\n async getStatus(): Promise<any> {\n return this.command('get_status_metadata');\n }\n\n async command(type: string, args: Record<string, unknown> = {}): Promise<any> {\n return this.sendIpcCommand(type, args);\n }\n\n async meshCommand(\n targetDaemonId: string,\n command: string,\n args: Record<string, unknown> = {},\n ): Promise<any> {\n return this.sendIpcCommand('mesh_relay_command', {\n targetDaemonId,\n command,\n args,\n });\n }\n\n private sendIpcCommand(type: string, args: Record<string, unknown>): Promise<any> {\n const WebSocketCtor = globalThis.WebSocket;\n if (!WebSocketCtor) {\n return Promise.reject(new Error('WebSocket is not available in this Node runtime; Node 20+ is required for daemon IPC mode'));\n }\n\n const requestId = buildRequestId();\n const nestedCommand = typeof args?.command === 'string' ? args.command : '';\n const timeoutMs = getTimeoutMs(type, nestedCommand);\n const targetDaemonId = typeof args?.targetDaemonId === 'string' ? args.targetDaemonId : '';\n\n const diagnosticParts = [\n `command='${type}'`,\n ...(nestedCommand ? [`relayedCommand='${nestedCommand}'`] : []),\n ...(targetDaemonId ? [`targetDaemonId='${targetDaemonId.slice(0, 12)}'`] : []),\n ...(typeof args?.nodeId === 'string' ? [`nodeId='${args.nodeId}'`] : []),\n ...(typeof args?.workspace === 'string' ? [`workspace='${args.workspace}'`] : []),\n ];\n\n const url = `ws://127.0.0.1:${this.port}${this.path}`;\n\n return new Promise((resolve, reject) => {\n let conn: PooledConnection;\n try {\n conn = getOrCreateConnection(WebSocketCtor as typeof WebSocket, url);\n } catch (e: any) {\n return reject(new Error(`Failed to create IPC connection: ${e?.message || e}`));\n }\n\n const timer = setTimeout(() => {\n conn.pending.delete(requestId);\n reject(new Error(`Daemon IPC ${diagnosticParts.join(' ')} timed out after ${Math.round(timeoutMs / 1000)}s (requestId=${requestId})`));\n }, timeoutMs);\n\n conn.pending.set(requestId, { resolve, reject, timer });\n conn.lastUsedAt = Date.now();\n\n if (conn.ready) {\n conn.ws.send(JSON.stringify({ type: 'ext:command', payload: { command: type, args, requestId } }));\n } else {\n conn.commandQueue.push({ type, args, requestId });\n }\n });\n }\n}\n","export type CompactChatMessage = Record<string, any>;\n\nexport function messageContent(message: any): string {\n const content = message?.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content.map((part: any) => (typeof part === 'string' ? part : part?.text ?? '')).join('');\n }\n return '';\n}\n\nexport function isCoordinatorVisibleMessage(message: any): boolean {\n if (!message || typeof message !== 'object') return false;\n const role = String(message.role ?? '').toLowerCase();\n if (role === 'tool' || role === 'system' || role === 'debug') return false;\n const kind = String(message.kind ?? message.type ?? message.messageKind ?? '').toLowerCase();\n if (['tool', 'tool_call', 'tool_result', 'terminal', 'internal', 'control', 'debug', 'status'].includes(kind)) return false;\n const meta = message.meta ?? message.metadata;\n if (meta?.internal === true || meta?.debug === true || meta?.control === true || meta?.userVisible === false || meta?.user_visible === false) return false;\n return role === 'user' || role === 'assistant' || role === 'agent';\n}\n\n/**\n * Build a one-line summary string for a tool/bash message that was filtered out.\n * Returns null when no useful summary can be extracted.\n */\nexport function summarizeToolMessage(message: any): string | null {\n if (!message || typeof message !== 'object') return null;\n const kind = String(message.kind ?? message.type ?? message.messageKind ?? '').toLowerCase();\n const role = String(message.role ?? '').toLowerCase();\n\n // Bash / terminal execution\n if (kind === 'terminal' || kind === 'bash') {\n const cmd = message.command ?? message.cmd ?? message.input ?? messageContent(message);\n const exit = message.exitCode ?? message.exit_code ?? message.code;\n const cmdShort = typeof cmd === 'string' ? cmd.split('\\n')[0].slice(0, 120) : null;\n if (!cmdShort) return null;\n return exit !== undefined && exit !== null ? `[Bash] ${cmdShort} → exit ${exit}` : `[Bash] ${cmdShort}`;\n }\n\n // Tool call (Claude-style function call)\n if (kind === 'tool_call' || kind === 'tool' || role === 'tool') {\n const name = message.name ?? message.toolName ?? message.tool_name ?? message.function?.name;\n if (typeof name === 'string' && name.trim()) return `[Tool] ${name.trim()}`;\n return null;\n }\n\n // Tool result with explicit exit code\n if (kind === 'tool_result') {\n const exit = message.exitCode ?? message.exit_code ?? message.code;\n const name = message.name ?? message.toolName ?? message.tool_name;\n const label = typeof name === 'string' && name.trim() ? name.trim() : 'tool';\n return exit !== undefined && exit !== null ? `[Tool result: ${label}] exit ${exit}` : null;\n }\n\n return null;\n}\n\nexport function buildCompactMessageTail(\n visibleMessages: CompactChatMessage[],\n opts: { summary?: string; finalAssistant?: CompactChatMessage | undefined; limit: number },\n): CompactChatMessage[] {\n const tail = visibleMessages.slice(-opts.limit);\n // Always include the final assistant message even if it falls outside the tail window.\n if (opts.finalAssistant && !tail.includes(opts.finalAssistant)) {\n return [opts.finalAssistant, ...tail];\n }\n return tail;\n}\n\n/**\n * Normalize message text for an equality check between the compact `summary`\n * field and a message bubble's content. Trims and collapses interior whitespace\n * so trivially-different copies of the same report compare equal.\n */\nfunction normalizeForSummaryEquality(value: string): string {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * When compact mode lifts the final assistant bubble into the `summary` field,\n * the same report text would otherwise be serialized a SECOND time inside the\n * returned `messages[]` tail — exactly doubling the payload for long reports.\n * This rewrites any tail bubble whose content is substantively identical to the\n * summary into a content-free stub carrying `_sameAsSummary: true`, so the body\n * lives exactly once (in `summary`). Bubble position/role/timestamp are preserved\n * for callers that walk the tail; the body is recoverable from `summary`.\n */\nexport function dedupeSummaryFromTail(\n messages: CompactChatMessage[],\n summary: string | undefined,\n): CompactChatMessage[] {\n const normalizedSummary = summary ? normalizeForSummaryEquality(summary) : '';\n if (!normalizedSummary) return messages;\n return messages.map((message) => {\n const role = String(message?.role ?? '').toLowerCase();\n if (role !== 'assistant' && role !== 'agent') return message;\n const content = messageContent(message);\n if (!content.trim()) return message;\n if (normalizeForSummaryEquality(content) !== normalizedSummary) return message;\n const { content: _omitted, ...rest } = message;\n return { ...rest, content: '', _sameAsSummary: true };\n });\n}\n\nexport function compactChatPayload(\n payload: any,\n opts: { sessionId?: string | null; nodeId?: string; limit?: number } = {},\n): any {\n const rawMessages = Array.isArray(payload?.messages) ? payload.messages : [];\n const visible = rawMessages.filter(isCoordinatorVisibleMessage);\n const limit = Math.max(1, Math.min(opts.limit ?? 10, 10));\n const finalAssistant = [...visible].reverse().find((message: any) => {\n const role = String(message?.role ?? '').toLowerCase();\n return (role === 'assistant' || role === 'agent') && messageContent(message).trim();\n });\n const summary = typeof payload?.summary === 'string' && payload.summary.trim()\n ? payload.summary.trim()\n : messageContent(finalAssistant).trim();\n // The final assistant bubble is now lifted into `summary`; strip its duplicate\n // body from the tail so a long report isn't serialized twice (leak #1).\n const messages = dedupeSummaryFromTail(\n buildCompactMessageTail(visible, { summary, finalAssistant, limit }),\n summary,\n );\n\n // Collect one-line summaries for filtered-out tool/bash messages so the coordinator\n // can see what actions were taken without reading the full transcript.\n const toolSummaries = rawMessages\n .filter((m: any) => !isCoordinatorVisibleMessage(m))\n .map(summarizeToolMessage)\n .filter((s: string | null): s is string => s !== null);\n\n // omittedMessages = total messages not included in the returned `messages` tail.\n // This includes both filtered (tool/system) messages AND visible messages cut off by the tail limit.\n const omittedMessages = Math.max(0, rawMessages.length - messages.length);\n // filteredMessages = only the non-user-visible messages (for backward compat).\n const filteredMessages = Math.max(0, rawMessages.length - visible.length);\n\n return {\n success: payload?.success !== false,\n compact: true,\n ...(opts.nodeId ? { nodeId: opts.nodeId } : {}),\n ...(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : {}),\n status: payload?.status ?? null,\n providerSessionId: payload?.providerSessionId ?? null,\n totalMessages: rawMessages.length,\n visibleMessages: visible.length,\n filteredMessages,\n omittedMessages,\n ...(toolSummaries.length > 0 ? { toolSummaries } : {}),\n summary,\n ...(payload?.changedFiles !== undefined ? { changedFiles: payload.changedFiles } : {}),\n ...(payload?.testsRun !== undefined ? { testsRun: payload.testsRun } : {}),\n messages,\n };\n}\n","/**\n * Mesh Tools — Mesh-scoped coordinator tools for Repo Mesh orchestration\n *\n * These tools wrap existing MCP transport operations but restrict targets\n * to mesh member nodes only. The coordinator uses these to delegate work\n * to agents across the mesh via natural conversation.\n *\n * 29 tools: mesh_status, mesh_mission_upsert, mesh_mission_list, mesh_list_nodes, mesh_enqueue_task, mesh_view_queue,\n * mesh_queue_cancel, mesh_queue_requeue, mesh_send_task, mesh_read_chat,\n * mesh_read_debug, mesh_launch_session, mesh_git_status,\n * mesh_fast_forward_node, mesh_checkpoint, mesh_approve,\n * mesh_clone_node, mesh_remove_node, mesh_refine_node,\n * mesh_refine_config_schema, mesh_validate_refine_config,\n * mesh_suggest_refine_config, mesh_refine_plan,\n * mesh_cleanup_sessions, mesh_task_history, mesh_reconcile_ledger,\n * mesh_review_inbox\n */\n\n// ─── Internal module ───────────────────────────\n// Shared helpers, types, module-level state, and dependency re-exports for the mesh tool\n// domain files (mesh-tools-{status,queue,mission,session,git,refine}.ts). Split out of\n// mesh-tools.ts as a pure move — no behavior change. mesh-tools.ts is now a re-export barrel.\n\nimport { randomUUID } from 'node:crypto';\nimport { IpcTransport } from '../transports/ipc.js';\nimport type { CommandTransport } from '../transports/mode.js';\nimport { compactChatPayload, isCoordinatorVisibleMessage, messageContent } from './chat-compact.js';\nimport { annotateRapidReadChatAdvisory } from './read-chat-polling-advisory.js';\nimport type { LocalMeshEntry, LocalMeshNodeEntry, MeshActiveWorkSummary, RepoMeshPolicy, RepoMeshRelatedRepo } from '@adhdev/daemon-core';\nimport {\n daemonIdsEquivalent,\n meshNodeIdMatches,\n appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n summarizeMeshAsyncRefineJobs,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildMeshNodeCapabilityTags,\n buildMeshNodeProbeFreshness,\n buildMeshSchedulingRuntime,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n pruneStaleDirectDispatches,\n describeTaskDependencyState,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n computeMeshMissionStats,\n computeMeshTaskStats,\n getActiveMeshMissionSummaries,\n getMeshStatusMissionSummaries,\n getMeshStatusMissionsCompact,\n listMeshMissionSummaries,\n MESH_MISSION_STATUSES,\n upsertMeshMission,\n getActiveDirectDispatches,\n getQueue,\n getLedgerSummary,\n getSessionRecoveryContext,\n insertDirectDispatch,\n recordDirectDispatchTask,\n isP2pRelayTransportFailure,\n markStaleDirectDispatches,\n nodeSatisfiesRequiredTags,\n normalizeMeshCapabilityTags,\n readLedgerEntries,\n readLedgerSlice,\n readLedgerSliceFromStore,\n reconcileDirectDispatchCompletionFromTranscript,\n recordMeshToolCall,\n requeueTask,\n resolveMeshSurfacedSessionPreview,\n resolveDelegatedWorkerAutoApprove,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\nimport { readString, readNumeric, LARGE_LEDGER_FIELD_KEYS, summarizeLargeLedgerField, elideLargeNestedValue } from './mesh-tool-shared.js';\nimport {\n readSessionRecordId,\n extractStatusMetadataSessions,\n resolveSessionProviderType,\n isMeshCoordinatorSessionRecord,\n isUnmanagedSessionRecord,\n isWorkerTaskMode,\n collectNodeSessionIds,\n unwrapCommandPayload,\n isTerminalSessionRecord,\n isIdleSessionRecord,\n} from './mesh-session-helpers.js';\nimport {\n ACTIVE_QUEUE_STATUSES,\n HISTORICAL_QUEUE_STATUSES,\n COMPACT_MAX_ACTIVE_QUEUE_ROWS,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n buildQueueStatusSummary,\n normalizeQueueViewMode,\n sanitizeQueueStatusFilter,\n filterQueueForView,\n prioritizeActiveQueueRows,\n buildQueueMaintenanceReport,\n buildCompactQueueMaintenanceReport,\n compactQueueRow,\n compactQueueRows,\n compactActiveWorkRecords,\n annotateQueueStaleness,\n} from './mesh-queue-helpers.js';\nimport type { QueueViewMode } from './mesh-queue-helpers.js';\nimport {\n compactMeshStatusNode,\n compactNodeSeverity,\n isNoteworthyCompactNode,\n minimalCompactNode,\n summarizeNodeSessions,\n} from './mesh-compact.js';\n\n// Node identity / locality helpers were physically moved to ./mesh-node-identity.ts\n// (pure move, no behavior change). Imported back for internal use here.\nimport {\n resolveCoordinatorNode,\n resolveCoordinatorDaemonId,\n readNodeMachineId,\n readNodeDaemonId,\n buildNodeMachineIdentity,\n resolvePreferredWorktreeNodeId,\n isLocalControlPlaneNode,\n} from './mesh-node-identity.js';\n\n// Re-exported so the public `./tools/mesh-tools.js` path still exposes it.\nexport { resolveCoordinatorDaemonId } from './mesh-node-identity.js';\n\n\n// ─── Tool Definitions ───────────────────────────\n\n// Tool schema definitions live in ./mesh-tool-schemas.ts. Re-exported here so the\n// public `./tools/mesh-tools.js` import path (server.ts, help.ts) is unchanged.\nexport {\n MESH_STATUS_TOOL,\n MESH_LIST_NODES_TOOL,\n MESH_ENQUEUE_TASK_TOOL,\n MESH_VIEW_QUEUE_TOOL,\n MESH_QUEUE_CANCEL_TOOL,\n MESH_QUEUE_REQUEUE_TOOL,\n MESH_SEND_TASK_TOOL,\n MESH_READ_CHAT_TOOL,\n MESH_READ_DEBUG_TOOL,\n MESH_LAUNCH_SESSION_TOOL,\n MESH_GIT_STATUS_TOOL,\n MESH_READ_NODE_LOGS_TOOL,\n MESH_FAST_FORWARD_NODE_TOOL,\n MESH_RESTART_DAEMON_TOOL,\n MESH_CHECKPOINT_TOOL,\n MESH_MISSION_UPSERT_TOOL,\n MESH_MISSION_LIST_TOOL,\n MESH_APPROVE_TOOL,\n MESH_CLONE_NODE_TOOL,\n MESH_REMOVE_NODE_TOOL,\n MESH_CLEANUP_SESSIONS_TOOL,\n MESH_TASK_HISTORY_TOOL,\n MESH_RECORD_NOTE_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n MESH_PRUNE_STALE_DIRECT_TOOL,\n MESH_REFINE_NODE_TOOL,\n MESH_REFINE_BATCH_TOOL,\n MESH_REFINE_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_REFINE_CONFIG_TOOL,\n MESH_SUGGEST_REFINE_CONFIG_TOOL,\n MESH_CHANGE_IMPACT_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_SUGGEST_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_INIT_TOOL,\n MESH_REFINE_PLAN_TOOL,\n MESH_REVIEW_INBOX_TOOL,\n ALL_MESH_TOOLS,\n} from './mesh-tool-schemas.js';\n\n// Re-export imported dependencies so the domain tool files import everything from this module.\nexport {\n IpcTransport,\n} from '../transports/ipc.js';\nexport type {\n CommandTransport,\n} from '../transports/mode.js';\nexport {\n compactChatPayload,\n isCoordinatorVisibleMessage,\n messageContent,\n} from './chat-compact.js';\nexport {\n compactMeshStatusNode,\n compactNodeSeverity,\n isNoteworthyCompactNode,\n minimalCompactNode,\n summarizeNodeSessions,\n} from './mesh-compact.js';\nexport {\n buildNodeMachineIdentity,\n isLocalControlPlaneNode,\n readNodeDaemonId,\n readNodeMachineId,\n resolveCoordinatorNode,\n resolvePreferredWorktreeNodeId,\n} from './mesh-node-identity.js';\nexport {\n ACTIVE_QUEUE_STATUSES,\n COMPACT_MAX_ACTIVE_QUEUE_ROWS,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n HISTORICAL_QUEUE_STATUSES,\n annotateQueueStaleness,\n buildCompactQueueMaintenanceReport,\n buildQueueMaintenanceReport,\n buildQueueStatusSummary,\n compactActiveWorkRecords,\n compactQueueRow,\n compactQueueRows,\n filterQueueForView,\n normalizeQueueViewMode,\n prioritizeActiveQueueRows,\n sanitizeQueueStatusFilter,\n} from './mesh-queue-helpers.js';\nexport type {\n QueueViewMode,\n} from './mesh-queue-helpers.js';\nexport {\n collectNodeSessionIds,\n extractStatusMetadataSessions,\n isIdleSessionRecord,\n isMeshCoordinatorSessionRecord,\n isTerminalSessionRecord,\n isUnmanagedSessionRecord,\n isWorkerTaskMode,\n readSessionRecordId,\n resolveSessionProviderType,\n unwrapCommandPayload,\n} from './mesh-session-helpers.js';\nexport {\n LARGE_LEDGER_FIELD_KEYS,\n elideLargeNestedValue,\n readNumeric,\n readString,\n summarizeLargeLedgerField,\n} from './mesh-tool-shared.js';\nexport {\n annotateRapidReadChatAdvisory,\n} from './read-chat-polling-advisory.js';\nexport {\n MESH_MISSION_STATUSES,\n appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildMeshNodeCapabilityTags,\n buildMeshNodeProbeFreshness,\n buildMeshSchedulingRuntime,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n computeMeshMissionStats,\n computeMeshTaskStats,\n daemonIdsEquivalent,\n deleteDirectDispatchesByTaskId,\n describeTaskDependencyState,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n getActiveDirectDispatches,\n getActiveMeshMissionSummaries,\n getLedgerSummary,\n getMeshStatusMissionSummaries,\n getMeshStatusMissionsCompact,\n getQueue,\n getSessionRecoveryContext,\n insertDirectDispatch,\n isP2pRelayTransportFailure,\n listMeshMissionSummaries,\n markStaleDirectDispatches,\n meshNodeIdMatches,\n nodeSatisfiesRequiredTags,\n normalizeMeshCapabilityTags,\n pruneStaleDirectDispatches,\n readLedgerEntries,\n readLedgerSlice,\n readLedgerSliceFromStore,\n reconcileDirectDispatchCompletionFromTranscript,\n recordDirectDispatchTask,\n recordMeshToolCall,\n requeueTask,\n resolveDelegatedWorkerAutoApprove,\n resolveMeshSurfacedSessionPreview,\n summarizeMeshAsyncRefineJobs,\n upsertMeshMission,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\nexport type {\n LocalMeshEntry,\n LocalMeshNodeEntry,\n MeshActiveWorkSummary,\n MeshSchedulingRuntime,\n MeshNodeSchedulingRuntime,\n RepoMeshPolicy,\n RepoMeshRelatedRepo,\n} from '@adhdev/daemon-core';\nexport {\n randomUUID,\n} from 'node:crypto';\n\nexport interface MeshContext {\n mesh: LocalMeshEntry;\n transport: CommandTransport;\n /** Daemon ID for this local machine (local mode) */\n localDaemonId?: string;\n /** Machine Registry ID for this local machine */\n localMachineId?: string;\n /** Hostname of the daemon/MCP coordinator machine. */\n coordinatorHostname?: string;\n /**\n * Runtime session id of THIS coordinator's CLI session, injected by the daemon at\n * coordinator launch via ADHDEV_COORDINATOR_SESSION_ID. Stamped onto dispatched\n * workers (meshContext.coordinatorSessionId) so a worker's completion event routes\n * back to the exact originating coordinator session — even when several coordinator\n * sessions share one daemon. Absent for non-coordinator / legacy launches → routing\n * falls back to the daemon-level anchor.\n */\n coordinatorSessionId?: string;\n}\n\nexport type MeshSessionProviderMetadata = {\n providerType: string;\n providerSessionId?: string;\n};\n\nexport const SESSION_PROVIDER_METADATA_TTL_MS = 30 * 60_000;\n\nexport type TimestampedSessionMetadata = MeshSessionProviderMetadata & { expiresAt: number };\n\nexport const meshSessionProviderMetadata = new Map<string, TimestampedSessionMetadata>();\n\nexport function getSessionMetadata(key: string): MeshSessionProviderMetadata | undefined {\n const entry = meshSessionProviderMetadata.get(key);\n if (!entry) return undefined;\n if (entry.expiresAt <= Date.now()) {\n meshSessionProviderMetadata.delete(key);\n return undefined;\n }\n return entry;\n}\n\nexport const ACTIVE_WORK_POLLING_BACKOFF_MS = 60_000;\n\nexport interface MeshPollingGuidance {\n activeGeneratingWork: true;\n generatingCount: number;\n doNotPollBefore: string;\n eventSurface: 'pendingCoordinatorEvents';\n nextRecommendedAction: string;\n message: string;\n}\n\nexport function buildActiveWorkPollingGuidance(summary: MeshActiveWorkSummary, now = Date.now()): MeshPollingGuidance | undefined {\n if (!summary || summary.generatingCount <= 0) return undefined;\n return {\n activeGeneratingWork: true,\n generatingCount: summary.generatingCount,\n doNotPollBefore: new Date(now + ACTIVE_WORK_POLLING_BACKOFF_MS).toISOString(),\n eventSurface: 'pendingCoordinatorEvents',\n nextRecommendedAction: 'Wait for pendingCoordinatorEvents/completion events or an explicit user status request. If no terminal evidence appears and the user asks for status, make one bounded status check, then wait again.',\n message: 'Do not repeatedly poll mesh_status/mesh_view_queue/mesh_read_chat while delegated work is generating; terminal ledger or completion evidence will be surfaced through pendingCoordinatorEvents when available.',\n };\n}\n\n\n// ─── Helpers ────────────────────────────────────\n\nexport function summarizeTaskMessage(message: string): { taskTitle: string; taskSummary: string } {\n const taskSummary = message.replace(/\\s+/g, ' ').trim();\n const taskTitle = taskSummary.length > 96 ? `${taskSummary.slice(0, 93)}...` : taskSummary;\n return { taskTitle: taskTitle || '(untitled task)', taskSummary };\n}\n\nexport function buildDirectTaskPayload(\n message: string,\n via: 'p2p_direct' | 'local_direct' | 'mesh_send_task',\n opts: {\n taskId: string;\n taskMode?: string;\n providerType?: string;\n targetSessionId?: string;\n /** When true, the target session was idle at time of dispatch. This flag helps\n * mesh-active-work stale detection identify unacknowledged direct dispatches. */\n dispatchedToIdleSession?: boolean;\n },\n): Record<string, unknown> {\n const descriptor = summarizeTaskMessage(message);\n return {\n source: 'direct',\n via,\n taskId: opts.taskId,\n message,\n taskTitle: descriptor.taskTitle,\n taskSummary: descriptor.taskSummary,\n ...(opts.taskMode ? { taskMode: opts.taskMode } : {}),\n ...(opts.providerType ? { providerType: opts.providerType } : {}),\n ...(opts.targetSessionId ? { targetSessionId: opts.targetSessionId } : {}),\n ...(opts.dispatchedToIdleSession !== undefined ? { dispatchedToIdleSession: opts.dispatchedToIdleSession } : {}),\n };\n}\n\nexport function findNode(mesh: LocalMeshEntry, nodeId: string): LocalMeshNodeEntry {\n const node = mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (!node) throw new Error(`Node '${nodeId}' is not a member of mesh '${mesh.name}'`);\n return node;\n}\n\nexport const DUPLICATE_DISPATCH_WINDOW_MS = 60_000;\n\n// (queue constants/types moved to ./mesh-queue-helpers.ts)\n\n/**\n * Refresh the MCP process's mesh snapshot from the daemon inline mesh cache.\n * This is required for status/list tools when a previous MCP process already\n * created or removed worktree nodes through clone_mesh_node/remove_mesh_node.\n */\nexport async function refreshMeshFromDaemon(ctx: MeshContext): Promise<void> {\n try {\n const result = await ctx.transport.command('get_mesh', { meshId: ctx.mesh.id }) as any;\n if (!result?.success || !Array.isArray(result.mesh?.nodes)) return;\n const refreshedNodes = result.mesh.nodes\n .filter((n: any) => n?.id)\n .map((n: any) => n as LocalMeshNodeEntry);\n (ctx.mesh.nodes as LocalMeshNodeEntry[]).splice(0, ctx.mesh.nodes.length, ...refreshedNodes);\n ctx.mesh.updatedAt = result.mesh.updatedAt ?? ctx.mesh.updatedAt;\n } catch { /* refresh is best-effort; callers still report their original status/errors */ }\n}\n\nexport async function syncCoordinatorDaemonMeshCache(ctx: MeshContext): Promise<void> {\n if (!(ctx.transport instanceof IpcTransport)) return;\n try {\n await (ctx.transport as IpcTransport).command('get_mesh', {\n meshId: ctx.mesh.id,\n inlineMesh: ctx.mesh,\n });\n } catch {\n /* cache sync is best-effort; the MCP process still keeps its local ctx.mesh copy */\n }\n}\n\nexport async function findNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry> {\n const hit = ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n const refreshed = ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (!refreshed) throw new Error(`Node '${nodeId}' is not a member of mesh '${ctx.mesh.name}'`);\n return refreshed;\n}\n\nexport async function findOptionalNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry | null> {\n const hit = ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId));\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n return ctx.mesh.nodes.find(n => meshNodeIdMatches(n, nodeId)) ?? null;\n}\n\nexport function hasRecentDuplicateDispatch(ctx: MeshContext, args: { node_id: string; session_id?: string; message: string }): { duplicate: boolean; entry?: any; source?: 'ledger' | 'queue' } {\n const now = Date.now();\n const normalizedMessage = args.message.trim();\n\n for (const task of getQueue(ctx.mesh.id)) {\n const timestamp = new Date(task.updatedAt || task.createdAt).getTime();\n if (!Number.isFinite(timestamp) || now - timestamp > DUPLICATE_DISPATCH_WINDOW_MS) continue;\n if (task.targetNodeId && task.targetNodeId !== args.node_id) continue;\n if (task.assignedNodeId && task.assignedNodeId !== args.node_id) continue;\n if (args.session_id && task.targetSessionId !== args.session_id && task.assignedSessionId !== args.session_id) continue;\n if (task.message?.trim() === normalizedMessage) {\n return { duplicate: true, entry: task, source: 'queue' };\n }\n }\n\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n const timestamp = new Date(entry.timestamp).getTime();\n if (Number.isFinite(timestamp) && now - timestamp > DUPLICATE_DISPATCH_WINDOW_MS) break;\n if (entry.kind !== 'task_dispatched') continue;\n if (entry.nodeId !== args.node_id) continue;\n if (args.session_id && entry.sessionId !== args.session_id) continue;\n if (typeof entry.payload?.message !== 'string') continue;\n if (entry.payload.message.trim() === normalizedMessage) {\n return { duplicate: true, entry, source: 'ledger' };\n }\n }\n return { duplicate: false };\n}\n\nexport function buildMissingNodeReadChatRecovery(ctx: MeshContext, args: { node_id: string; session_id: string; provider_session_id?: string; tail?: number; compact?: boolean }): Record<string, unknown> {\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 300 });\n const relatedEntries = entries.filter(entry => entry.nodeId === args.node_id || entry.sessionId === args.session_id);\n const completedEntries = relatedEntries.filter(entry => entry.kind === 'task_completed');\n const lastDispatch = [...relatedEntries].reverse().find(entry => entry.kind === 'task_dispatched');\n const lastTerminal = [...relatedEntries].reverse().find(entry => entry.kind === 'task_completed' || entry.kind === 'task_failed' || entry.kind === 'task_stalled');\n const lastRemoved = [...relatedEntries].reverse().find(entry => entry.kind === 'node_removed');\n const lastLaunch = [...relatedEntries].reverse().find(entry => entry.kind === 'session_launched');\n const providerSessionId = args.provider_session_id\n || readString(lastTerminal?.payload?.providerSessionId)\n || readString(lastLaunch?.payload?.providerSessionId)\n || readString(lastDispatch?.payload?.providerSessionId);\n const finalSummary = readString(lastTerminal?.payload?.finalSummary)\n || readString(lastTerminal?.payload?.compactSummary)\n || readString(lastTerminal?.payload?.summary);\n const ledger = {\n taskCompletedFound: completedEntries.length > 0,\n nodeRemovedFound: !!lastRemoved,\n providerType: lastTerminal?.providerType || lastLaunch?.providerType || lastDispatch?.providerType,\n providerSessionId,\n nodeRemovedAt: lastRemoved?.timestamp,\n sessionCleanupMode: readString(lastRemoved?.payload?.sessionCleanupMode),\n readDebugLocator: readString(lastTerminal?.payload?.readDebugLocator) || readString(lastTerminal?.payload?.debugBundlePath),\n };\n\n if (finalSummary) {\n if (args.compact === true) {\n return {\n ...compactChatPayload({\n success: true,\n status: 'idle',\n providerSessionId,\n summary: finalSummary,\n messages: [{ role: 'assistant', content: finalSummary, isHistorical: true }],\n }, {\n nodeId: args.node_id,\n sessionId: args.session_id,\n limit: args.tail ?? 10,\n }),\n recoveredFromLedger: true,\n ledger,\n };\n }\n return {\n success: true,\n compact: false,\n recoveredFromLedger: true,\n nodeId: args.node_id,\n sessionId: args.session_id,\n summary: finalSummary,\n ledger,\n messages: [{ role: 'assistant', content: finalSummary, isHistorical: true }],\n };\n }\n\n return {\n success: false,\n recoverable: true,\n code: 'mesh_removed_node_transcript_unavailable',\n error: `Node '${args.node_id}' is not a current member of mesh '${ctx.mesh.name}'.`,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerSessionId,\n reason: 'node_not_in_current_mesh_snapshot',\n ledger,\n completedSessionSeenInLedger: ledger.taskCompletedFound,\n lastDispatch: lastDispatch ? {\n timestamp: lastDispatch.timestamp,\n sessionId: lastDispatch.sessionId,\n providerType: lastDispatch.providerType,\n taskId: typeof lastDispatch.payload?.taskId === 'string' ? lastDispatch.payload.taskId : undefined,\n messagePreview: typeof lastDispatch.payload?.message === 'string' ? lastDispatch.payload.message.slice(0, 500) : undefined,\n } : null,\n lastTerminalEvent: lastTerminal ? {\n kind: lastTerminal.kind,\n timestamp: lastTerminal.timestamp,\n sessionId: lastTerminal.sessionId,\n providerType: lastTerminal.providerType,\n taskId: typeof lastTerminal.payload?.taskId === 'string' ? lastTerminal.payload.taskId : undefined,\n payload: lastTerminal.payload,\n } : null,\n nextSteps: [\n providerSessionId\n ? `Retry mesh_read_chat with provider_session_id='${providerSessionId}' on a current live node for the same daemon if one exists.`\n : 'If the node UI shows a provider transcript id, retry mesh_read_chat/mesh_read_debug with provider_session_id.',\n 'Use mesh_read_debug with the provider_session_id or daemon-side debug bundle locator if available.',\n 'Check mesh_task_history for task_completed and node_removed entries before redispatching; do not resend solely because transcript recovery failed.',\n 'If this node was removed with stop_and_delete, the runtime transcript may be gone; rely on the ledger summary/locator or ask the operator for the saved UI output.',\n ],\n recoveryHints: [\n 'The worktree/node may have been removed or the mesh snapshot may be stale after task completion.',\n 'If you have a provider_session_id, retry mesh_read_chat with that value while targeting a live node for the same daemon if available.',\n 'Use mesh_read_debug with provider_session_id, or inspect the daemon/session-host history locator if the transcript has already been archived.',\n 'Avoid redispatching the same task solely because read_chat could not recover the transcript; check task_history and git status first.',\n ],\n };\n}\n\n\n// (queue helpers moved to ./mesh-queue-helpers.ts)\n\n// (moved to ./mesh-session-helpers.ts — session/payload record helpers)\n\nexport function isDirectDispatchLedgerEntry(entry: any): boolean {\n if (entry?.kind !== 'task_dispatched') return false;\n const payload = entry.payload || {};\n const via = readString(payload.via);\n return payload.source === 'direct' || via === 'p2p_direct' || via === 'local_direct' || via === 'mesh_send_task';\n}\n\nexport function readMessageTimestampIso(message: any): string | undefined {\n for (const value of [message?.timestamp, message?.createdAt, message?.created_at, message?.updatedAt, message?.time]) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const ms = value > 10_000_000_000 ? value : value * 1000;\n return new Date(ms).toISOString();\n }\n if (typeof value === 'string' && value.trim()) {\n const ms = new Date(value.trim()).getTime();\n if (Number.isFinite(ms)) return new Date(ms).toISOString();\n }\n }\n return undefined;\n}\n\nexport function readFinalAssistantTranscriptEvidence(payload: any): { finalSummary?: string; transcriptMessageAt?: string } {\n const rawMessages = Array.isArray(payload?.messages) ? payload.messages : [];\n const finalAssistant = [...rawMessages]\n .reverse()\n .filter(isCoordinatorVisibleMessage)\n .find((message: any) => {\n const role = String(message?.role ?? '').toLowerCase();\n return (role === 'assistant' || role === 'agent') && messageContent(message).trim();\n });\n const finalSummary = messageContent(finalAssistant).trim()\n || (typeof payload?.summary === 'string' && payload.summary.trim() ? payload.summary.trim() : undefined);\n return {\n finalSummary,\n transcriptMessageAt: finalAssistant ? readMessageTimestampIso(finalAssistant) : undefined,\n };\n}\n\nexport function findNodeSession(nodes: any[], nodeId?: string | null, sessionId?: string | null): { node?: any; session?: any } {\n if (!nodeId || !sessionId) return {};\n const node = nodes.find((candidate: any) => meshNodeIdMatches(candidate, nodeId));\n if (!node) return {};\n const sessions = Array.isArray(node.sessions) ? node.sessions : [];\n const session = sessions.find((candidate: any) => readSessionRecordId(candidate) === sessionId);\n return { node, session };\n}\n\nexport function buildDirectDispatchReconciliationCandidates(directDispatches: any[], ledgerEntries: any[]): any[] {\n const candidates: any[] = [];\n const seenTaskIds = new Set<string>();\n for (const dispatch of directDispatches || []) {\n const taskId = readString(dispatch?.taskId);\n if (!taskId || seenTaskIds.has(taskId)) continue;\n seenTaskIds.add(taskId);\n candidates.push(dispatch);\n }\n for (const entry of ledgerEntries || []) {\n if (!isDirectDispatchLedgerEntry(entry)) continue;\n const taskId = readString(entry.payload?.taskId);\n if (!taskId || seenTaskIds.has(taskId)) continue;\n seenTaskIds.add(taskId);\n candidates.push({\n taskId,\n nodeId: entry.nodeId,\n sessionId: entry.sessionId,\n providerType: entry.providerType || readString(entry.payload?.providerType),\n message: readString(entry.payload?.message),\n dispatchedAt: entry.timestamp,\n via: readString(entry.payload?.via),\n });\n }\n return candidates;\n}\n\nexport async function reconcileDirectDispatchesFromTranscriptEvidence(\n ctx: MeshContext,\n liveNodes: any[],\n directDispatches: any[],\n ledgerEntries: any[],\n): Promise<{ attempted: number; reconciled: number; skipped: number }> {\n let attempted = 0;\n let reconciled = 0;\n let skipped = 0;\n const candidates = buildDirectDispatchReconciliationCandidates(directDispatches, ledgerEntries);\n for (const dispatch of candidates) {\n const taskId = readString(dispatch?.taskId);\n const nodeId = readString(dispatch?.nodeId);\n const sessionId = readString(dispatch?.sessionId);\n if (!taskId || !nodeId || !sessionId) {\n skipped += 1;\n continue;\n }\n const { session } = findNodeSession(liveNodes, nodeId, sessionId);\n if (!session || !isIdleSessionRecord(session)) {\n skipped += 1;\n continue;\n }\n const node = await findOptionalNodeWithRefresh(ctx, nodeId).catch(() => null);\n if (!node) {\n skipped += 1;\n continue;\n }\n const providerType = readString(dispatch?.providerType) || resolveSessionProviderType(session);\n const providerSessionId = readString(session?.providerSessionId)\n || readString(session?.activeChat?.providerSessionId)\n || readString(session?.settings?.providerSessionId)\n || resolveMeshSessionProviderMetadata(ctx, nodeId, sessionId)?.providerSessionId;\n attempted += 1;\n try {\n const readResult = await commandForNode(ctx, node, 'read_chat', {\n sessionId,\n targetSessionId: sessionId,\n workspace: node.workspace,\n ...(providerType ? { agentType: providerType, providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n tailLimit: 10,\n });\n const payload = unwrapCommandPayload(readResult);\n if (payload?.success === false) continue;\n const evidence = readFinalAssistantTranscriptEvidence(payload);\n if (!evidence.finalSummary) continue;\n const result = reconcileDirectDispatchCompletionFromTranscript({\n meshId: ctx.mesh.id,\n nodeId,\n sessionId,\n providerType,\n providerSessionId: readString(payload?.providerSessionId) || providerSessionId,\n taskId,\n finalSummary: evidence.finalSummary,\n transcriptMessageAt: evidence.transcriptMessageAt,\n targetCoordinatorDaemonId: ctx.localDaemonId,\n source: 'mcp_mesh_status_transcript_reconciliation',\n });\n if (result.reconciled) reconciled += 1;\n } catch {\n skipped += 1;\n }\n }\n return { attempted, reconciled, skipped };\n}\n\nexport async function triggerMeshQueueAndReport(\n ctx: MeshContext,\n): Promise<Record<string, unknown> | undefined> {\n try {\n // trigger_mesh_queue is a coordinator-only operation: triggerMeshQueue\n // reads the mesh object, the coordinator's local CLI instances, and the\n // queue ledger (stored on THIS machine), then dispatches assignments to\n // remote idle sessions over P2P itself. Relaying trigger_mesh_queue to a\n // remote worker daemon would hit requireMeshHostMutationOwner →\n // getMeshForCommand → null ('Mesh not found'), because only the\n // coordinator daemon hosts the mesh. Always run it on the coordinator's\n // local IPC, regardless of which node prompted the trigger.\n const raw = await ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id });\n const payload = unwrapCommandPayload(raw);\n const trigger = payload?.trigger && typeof payload.trigger === 'object' ? payload.trigger : payload;\n return trigger && typeof trigger === 'object' ? trigger : { success: true };\n } catch (e: any) {\n return {\n success: false,\n error: e?.message || String(e),\n };\n }\n}\n\nexport function buildQueueTriggerGuidance(queueTrigger: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!queueTrigger || queueTrigger.claimed === true) return undefined;\n if (queueTrigger.success === false) {\n return {\n queueClaimed: false,\n queueDispatchState: 'trigger_failed',\n nextAction: 'Do not assume the queued task is running. Check mesh_view_queue and daemon connectivity before redispatching.',\n };\n }\n if (queueTrigger.autoLaunchPending === true) {\n // The coordinator already spun up (or is spinning up) a worker session for this\n // task — it is booting and will claim within a few seconds. Telling the caller to\n // launch ANOTHER session here would double-edit the worktree. Do NOT advise a new\n // launch; just wait for the in-flight session to claim.\n return {\n queueClaimed: false,\n queueDispatchState: 'pending_waiting_for_autolaunch',\n nextAction: 'A worker session was just auto-launched for this task and is booting; it will claim the task shortly. Wait for it to claim — do NOT launch another session. Use mesh_view_queue to confirm the assignment lands.',\n };\n }\n if (queueTrigger.noIdleMeshSessionAvailable === true) {\n return {\n queueClaimed: false,\n queueDispatchState: 'pending_no_idle_mesh_session',\n nextAction: 'The task is queued but not running. Launch a managed worker with mesh_launch_session, or wait for a delegated session to become ready and trigger the queue again.',\n };\n }\n return {\n queueClaimed: false,\n queueDispatchState: 'pending_or_waiting_for_ready',\n nextAction: 'The task is queued but this trigger did not claim it. Use mesh_view_queue for the current active-work source of truth before retrying.',\n };\n}\n\n\n// (moved to ./mesh-session-helpers.ts — session/payload record helpers)\n\nexport function isMeshOwnedDelegateSession(session: any, meshId: string, nodeId: string): boolean {\n const settings = session?.settings;\n const sessionMeshId = typeof settings?.meshNodeFor === 'string' ? settings.meshNodeFor.trim() : '';\n const sessionNodeId = typeof settings?.meshNodeId === 'string' ? settings.meshNodeId.trim() : '';\n // meshNodeFor is the primary ownership signal. Relay safety is checked separately\n // for remote dispatch because older local delegates may not carry coordinator\n // daemon metadata.\n if (sessionMeshId) {\n if (sessionMeshId !== meshId) return false;\n return !sessionNodeId || sessionNodeId === nodeId;\n }\n // Post-detach: detachMeshAssignment intentionally clears meshNodeFor / meshNodeId /\n // meshActiveTaskId after a relay-safe completion, but preserves the coordinator\n // markers (launchedByCoordinator / meshCoordinatorDaemonId). Without recognizing\n // those, a follow-up dispatch to the SAME session would be misclassified as an\n // unrelated alias and rejected — even though the router self-heals meshNodeFor /\n // meshNodeId at dispatch time (buildMeshWorkerRelayStamp). Treat the preserved\n // coordinator markers as ownership evidence so the dispatch-time restamp can run.\n const coordinatorOwned = settings?.launchedByCoordinator === true || Boolean(readString(settings?.meshCoordinatorDaemonId));\n if (!coordinatorOwned) return false;\n // WTCLAIM (A): a detached coordinator session is reusable, but ONLY for the node\n // it last served. detachMeshAssignment preserves meshLastNodeId (the sticky bind\n // marker). On a daemon hosting BOTH a base node and a cloned worktree node (same\n // daemonId), without this gate a detached BASE session would be auto-picked for a\n // worktree-targeted sessionless dispatch — running worktree work on the base node.\n // When the sticky marker is present it must equal the requested node; legitimate\n // same-node reuse still passes. When absent (never bound, or a pre-fix session),\n // fall back to the prior permissive behavior — fix (B)'s worker-side nodeId/\n // workspace scoping is the defense-in-depth backstop for that residual case.\n const lastNodeId = readString(settings?.meshLastNodeId);\n if (lastNodeId) return lastNodeId === nodeId;\n return true;\n}\n\nexport function hasRemoteRelayMetadata(session: any): boolean {\n return Boolean(\n readString(session?.settings?.meshCoordinatorDaemonId)\n || readString(session?.meta?.meshCoordinatorDaemonId)\n || readString(session?.metadata?.meshCoordinatorDaemonId)\n || readString(session?.meshCoordinatorDaemonId),\n );\n}\n\nexport function isRelaySafeRemoteDelegateSession(session: any, meshId: string, nodeId: string): boolean {\n return isMeshOwnedDelegateSession(session, meshId, nodeId) && hasRemoteRelayMetadata(session);\n}\n\n\n/**\n * Pre-dispatch relay-safety classification for an explicit remote delegate\n * session. The local direct-dispatch path (commandForNode → agent_command) has\n * no such gate: it always dispatches with meshContext.coordinatorDaemonId, and\n * the remote router self-heals the session's meshCoordinatorDaemonId at dispatch\n * time (router.ts buildMeshWorkerRelayStamp). The remote path used to hard-block\n * any session lacking meshCoordinatorDaemonId, which prevented that dispatch-time\n * stamp from ever running — leaving launch-stamp-less but otherwise mesh-owned\n * sessions permanently relay-unsafe.\n *\n * Mirror the local path: a session that is mesh-owned for THIS mesh self-heals\n * as long as we can hand the remote router a coordinator anchor to stamp.\n *\n * - 'safe' — already carries meshCoordinatorDaemonId; dispatch as-is.\n * - 'self_heal' — mesh-owned for this mesh, missing the anchor, but a\n * coordinatorDaemonId is resolvable → dispatch and let the\n * remote router stamp the anchor (parity with local path).\n * - 'missing_anchor' — mesh-owned for this mesh, missing the anchor, AND no\n * coordinatorDaemonId resolvable → cannot delegate the stamp,\n * so completion events would still be undeliverable → block.\n * - 'unsafe_alias' — not mesh-owned for this mesh (different mesh / unrelated\n * session). Dispatching risks aliasing an unrelated transcript\n * and orphaning completion events → block.\n */\nexport function classifyRemoteDelegateRelaySafety(\n session: any,\n meshId: string,\n nodeId: string,\n coordinatorDaemonId: string,\n): 'safe' | 'self_heal' | 'missing_anchor' | 'unsafe_alias' {\n if (!isMeshOwnedDelegateSession(session, meshId, nodeId)) return 'unsafe_alias';\n if (hasRemoteRelayMetadata(session)) return 'safe';\n return coordinatorDaemonId ? 'self_heal' : 'missing_anchor';\n}\n\nexport function chooseDispatchableSession(sessions: any[], providerType: string, meshId: string, nodeId: string, coordinatorDaemonId: string): any | undefined {\n const live = sessions.filter(session => !isTerminalSessionRecord(session));\n const matchingProvider = (session: any) => !providerType || session?.providerType === providerType || session?.cliType === providerType;\n // Accept mesh-owned sessions whose relay anchor is either already present or\n // self-healable at dispatch time (coordinatorDaemonId resolvable). Mirrors the\n // explicit-session relay-safety classification so auto-pick and explicit\n // dispatch converge on the same set of safe delegates.\n const meshSessions = live.filter((session: any) => {\n const safety = classifyRemoteDelegateRelaySafety(session, meshId, nodeId, coordinatorDaemonId);\n return safety === 'safe' || safety === 'self_heal';\n });\n // Only auto-pick an IDLE matching session. The previous\n // `|| meshSessions.find(matchingProvider)` fallback accepted a generating/busy\n // session, injecting a new task into a session mid-generation — the exact case\n // the explicit-session path guards against via resolveDeliveryDecision (queue or\n // reject when !idle). When no idle session exists, return undefined so the caller\n // dispatches sessionless and lets the worker pick/create a session (or the task\n // queues), instead of clobbering an in-flight one.\n return meshSessions.find(session => isIdleSessionRecord(session) && matchingProvider(session))\n || undefined;\n}\n\nexport function buildRelayUnsafeRemoteSessionFailure(ctx: MeshContext, node: LocalMeshNodeEntry, sessionId: string, providerType?: string): ({ success: false; error: string } & Record<string, unknown>) {\n return {\n success: false,\n recoverable: true,\n code: 'mesh_delegate_session_missing_relay_metadata',\n reason: 'mesh_delegate_session_missing_relay_metadata',\n transport: 'mesh_transport',\n retryRecommended: true,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId: node.daemonId,\n workspace: node.workspace,\n sessionId,\n unsafeTranscriptAlias: true,\n ...(providerType ? { resolvedProviderType: providerType } : {}),\n error: `Remote session '${sessionId}' is not relay-safe for mesh '${ctx.mesh.id}': missing meshNodeFor/meshCoordinatorDaemonId metadata, so completion events would not reach the coordinator ledger. This session may be the coordinator itself or an unrelated session (unsafe_transcript_alias risk).`,\n nextAction: `Launch a fresh relay-safe session with mesh_launch_session(node_id: '${node.id}'${providerType ? `, type: '${providerType}'` : ''}) or dispatch without session_id so Repo Mesh can choose a valid delegate session.`,\n noFallbackReason: 'Blindly reusing a remote session without mesh relay metadata would silently drop task_completed / generating_completed events.',\n };\n}\n\nexport function buildMissingCoordinatorDaemonIdFailure(ctx: MeshContext, node: LocalMeshNodeEntry, providerType?: string): ({ success: false; error: string } & Record<string, unknown>) {\n return {\n success: false,\n recoverable: true,\n code: 'mesh_coordinator_daemon_unknown',\n reason: 'mesh_coordinator_daemon_unknown',\n transport: 'mesh_transport',\n retryRecommended: true,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId: node.daemonId,\n workspace: node.workspace,\n ...(providerType ? { resolvedProviderType: providerType } : {}),\n error: `Cannot launch a remote mesh delegate for node '${node.id}': coordinator daemon identity is unavailable, so the worker would be unable to relay completion events back to the coordinator.`,\n nextAction: 'Retry after the coordinator daemon identity is available (for example from an attached daemon-backed MCP session) so meshCoordinatorDaemonId can be stamped on the worker session.',\n noFallbackReason: 'Launching without meshCoordinatorDaemonId would create a worker session that can finish work but cannot emit task_completed / generating_completed back to the coordinator.',\n };\n}\n\nexport function findNestedPayload(value: any, predicate: (payload: any) => boolean): any {\n const seen = new Set<any>();\n const stack: Array<{ payload: any; depth: number }> = [{ payload: value, depth: 0 }];\n\n while (stack.length) {\n const { payload, depth } = stack.pop()!;\n if (predicate(payload)) return payload;\n if (!payload || typeof payload !== 'object' || seen.has(payload) || depth >= 8) continue;\n seen.add(payload);\n\n // Cloud/daemon relay layers have used both `result` and `payload` for\n // command_result bodies. Follow only those envelope keys so clone node\n // discovery stays tied to returned command payloads, not arbitrary data.\n for (const key of ['payload', 'result']) {\n if (key in payload) stack.push({ payload: payload[key], depth: depth + 1 });\n }\n }\n\n return value;\n}\n\nexport function extractCloneNodePayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.node?.id));\n}\n\nexport function extractGitStatus(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.status ?? value?.status ?? payload;\n}\n\nexport function extractGitDiff(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.diffSummary ?? payload?.diff ?? value?.diffSummary ?? value?.diff ?? payload;\n}\n\nexport function extractSubmodules(value: any, ignorePaths: string[]): any[] | undefined {\n const payload = unwrapCommandPayload(value);\n const subs = payload?.status?.submodules\n ?? payload?.submodules\n ?? value?.status?.submodules\n ?? value?.submodules;\n if (!Array.isArray(subs)) return undefined;\n if (ignorePaths.length === 0) return subs;\n const ignoreSet = new Set(ignorePaths);\n return subs.filter((s: any) => s?.path && !ignoreSet.has(s.path));\n}\n\nexport function assignFullGitSnapshot(entry: Record<string, unknown>, status: any): void {\n if (!status || typeof status !== 'object' || Array.isArray(status)) return;\n entry.git = status;\n}\n\n\n// (compact git-snapshot helpers moved to ./mesh-compact.ts)\n\n// (compactMeshStatusNode moved to ./mesh-compact.ts)\n\n// Compact mode bounds the node array so the payload stays under the MCP token cap\n// regardless of how many worktree nodes a mesh has. EVERY node stays present and\n// individually addressable (coordinators look nodes up by id), but \"quiet\" nodes —\n// healthy/clean, no sessions, nothing to converge — are reduced to a minimal stub\n// (id/workspace/health/branch/launchReady + branchConvergence decision scalars)\n// while \"noteworthy\" nodes (anything actionable) keep the full compact detail. On\n// top of that the detailed set is held to a serialized byte budget (highest\n// severity first); when the budget is exceeded the lowest-priority detailed nodes\n// degrade to the same minimal stub so even a mesh of all-noteworthy nodes can't\n// blow the cap. No node is ever dropped — only its detail level is reduced.\nexport const COMPACT_DETAILED_NODES_BYTE_BUDGET = 9000;\n\n// Total byte budget for the whole compact node array (detail + minimal stubs).\n// Nodes that don't fit even as a stub are folded into a counts+id-list summary so\n// the array stays bounded on pathologically large meshes; every node id is still\n// listed in foldedNodes.nodeIds, so nothing becomes undiscoverable.\nexport const COMPACT_NODES_TOTAL_BYTE_BUDGET = 13000;\n\n\n// Byte budget for the whole compact `missions` array (live active/paused missions).\n// Completed/abandoned history is already folded to a counts+id summary upstream;\n// this bounds the LIVE-mission detail so the section can't grow unbounded with the\n// number of active/paused missions. Newest-active first; overflow is folded into\n// `foldedMissions` (id list) so every live mission id stays addressable.\nexport const COMPACT_MISSIONS_BYTE_BUDGET = 6000;\n\n\n// (compact node-fold helpers moved to ./mesh-compact.ts)\n\nexport function extractLaunchPayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.sessionId || payload?.id || payload?.runtimeSessionId));\n}\n\nexport type MeshLaunchFailureClassification = {\n code: string;\n reason: string;\n transport: string;\n recoverable: boolean;\n retryRecommended: boolean;\n nextAction: string;\n noFallbackReason?: string;\n};\n\nexport function classifyMeshLaunchFailure(error: unknown): MeshLaunchFailureClassification {\n const message = error instanceof Error ? error.message : String(error || 'launch failed');\n const lower = message.toLowerCase();\n const p2pClassification = classifyP2pRelayFailure(error, { command: 'launch_cli' });\n if (p2pClassification.recoverable) {\n return p2pClassification;\n }\n if (lower.includes('cannot connect to daemon ipc') || lower.includes('daemon ipc command')) {\n return {\n code: 'local_ipc_unavailable',\n reason: 'local_daemon_ipc_unavailable',\n transport: 'local_ipc',\n recoverable: true,\n retryRecommended: true,\n nextAction: 'Check the local daemon IPC connection, then retry mesh_launch_session once after the daemon is reachable.',\n };\n }\n if (lower.includes('timed out') || lower.includes('timeout')) {\n return {\n code: 'mesh_transport_timeout',\n reason: 'mesh_transport_timeout',\n transport: 'mesh_transport',\n recoverable: true,\n retryRecommended: true,\n nextAction: 'Check mesh transport health, then do one bounded retry before requeueing or relaunching the task.',\n };\n }\n return {\n code: 'mesh_launch_failed',\n reason: 'provider_launch_failed',\n transport: 'mesh_transport',\n recoverable: false,\n retryRecommended: false,\n nextAction: 'Inspect the provider launch error and fix the underlying provider/configuration issue before retrying.',\n };\n}\n\nexport function buildWorktreeCleanupHint(node: LocalMeshNodeEntry): Record<string, unknown> | undefined {\n if (!node.isLocalWorktree) return undefined;\n return {\n tool: 'mesh_remove_node',\n args: { node_id: node.id, session_cleanup_mode: 'preserve' },\n hint: `If the worktree is no longer needed, remove the orphan worktree node with mesh_remove_node(node_id: \"${node.id}\").`,\n };\n}\n\nexport function buildRecoverableLaunchFailure(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n providerType: string | undefined,\n error: unknown,\n): Record<string, unknown> {\n const message = error instanceof Error ? error.message : String(error || 'launch failed');\n const classified = classifyMeshLaunchFailure(error);\n const cleanup = buildWorktreeCleanupHint(node);\n return {\n success: false,\n recoverable: classified.recoverable,\n code: classified.code,\n reason: classified.reason,\n transport: classified.transport,\n retryRecommended: classified.retryRecommended,\n nextAction: classified.nextAction,\n ...(classified.noFallbackReason ? { noFallbackReason: classified.noFallbackReason } : {}),\n error: message,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId: node.daemonId,\n workspace: node.workspace,\n isLocalWorktree: node.isLocalWorktree === true,\n worktreeBranch: node.worktreeBranch,\n clonedFromNodeId: node.clonedFromNodeId,\n ...(providerType ? { resolvedProviderType: providerType } : {}),\n retryHint: `Retry mesh_launch_session(node_id: \"${node.id}\"${providerType ? `, type: \"${providerType}\"` : ''}) after daemon mesh transport/P2P is healthy.`,\n ...(cleanup ? { cleanup } : {}),\n nextStepHints: [\n `Retry mesh_launch_session(node_id: \"${node.id}\"${providerType ? `, type: \"${providerType}\"` : ''}) after checking daemon/P2P health.`,\n ...(cleanup ? [`Cleanup orphan worktree node with mesh_remove_node(node_id: \"${node.id}\") if retry is not desired.`] : []),\n 'Run mesh_status to see the degraded reason and recovery hints before redispatching work.',\n ],\n };\n}\n\nexport function recordRecoverableLaunchFailure(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n providerType: string | undefined,\n error: unknown,\n): Record<string, unknown> {\n const failure = buildRecoverableLaunchFailure(ctx, node, providerType, error);\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'recovery_attempted',\n nodeId: node.id,\n providerType,\n payload: {\n event: 'session_launch_failed',\n ...failure,\n },\n });\n } catch { /* ledger append is best-effort */ }\n return failure;\n}\n\nexport function getLatestActiveLaunchFailure(meshId: string, nodeId: string): Record<string, unknown> | null {\n const entries = readLedgerEntries(meshId, { tail: 200 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n if (entry.nodeId !== nodeId) continue;\n if (entry.kind === 'session_launched' || entry.kind === 'node_removed') return null;\n if (entry.kind === 'recovery_attempted' && entry.payload?.event === 'session_launch_failed') {\n return { timestamp: entry.timestamp, ...entry.payload };\n }\n }\n return null;\n}\n\nexport type RemoteAgentDispatchResult =\n | { success: true; dispatched: true; sessionId: string; providerType?: string }\n | ({ success: false; error: string } & Record<string, unknown>);\n\nexport function buildCoordinatorP2pRelayFailure(\n error: unknown,\n context: { command: string; targetDaemonId?: string; nodeId?: string; sessionId?: string },\n): { success: false; error: string } & Record<string, unknown> {\n const payload = buildP2pRelayFailurePayload(error, {\n command: context.command,\n targetDaemonId: context.targetDaemonId,\n });\n return {\n ...payload,\n ...(context.nodeId ? { nodeId: context.nodeId } : {}),\n ...(context.sessionId ? { sessionId: context.sessionId } : {}),\n retryHint: payload.retryRecommended ? payload.nextAction : 'Do not retry as a P2P transport recovery; inspect the command/provider error first.',\n };\n}\n\n\n/**\n * For IpcTransport + remote node: resolve an active session on the node and\n * dispatch an agent_command directly via P2P relay (mesh_relay_command).\n *\n * This bypasses the local queue (which remote daemons cannot read) and sends\n * the message directly to the session running on the remote daemon.\n *\n * Returns { success, sessionId } or throws.\n */\nexport async function ipcDispatchToRemoteAgent(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n args: { session_id?: string; message: string; providerType?: string; verifiedSession?: any; meshContext?: { meshId: string; nodeId?: string; taskId?: string; coordinatorDaemonId?: string } },\n): Promise<RemoteAgentDispatchResult> {\n const transport = ctx.transport as IpcTransport;\n const daemonId = node.daemonId!;\n\n // The coordinator anchor the remote router will stamp onto the worker session\n // at dispatch time (router.ts buildMeshWorkerRelayStamp). When present, a\n // mesh-owned session that was never launch-stamped can still self-heal to\n // relay-safe — exactly like the local direct-dispatch path.\n const dispatchCoordinatorDaemonId = readString(args.meshContext?.coordinatorDaemonId) || '';\n\n let sessionId = args.session_id?.trim() || '';\n // Resolve provider type: caller arg > node policy providerPriority > empty (fuzzy fallback)\n const providerPriorityList: string[] = Array.isArray((node.policy as any)?.providerPriority)\n ? (node.policy as any).providerPriority\n : [];\n let resolvedProviderType = args.providerType?.trim() || providerPriorityList[0] || '';\n\n // Ask the remote daemon for live session truth when we need to auto-pick a\n // delegate session, or when an explicit session_id must be verified as a\n // relay-safe mesh-owned worker before we dispatch into it.\n if (sessionId && args.verifiedSession) {\n const explicitSession = args.verifiedSession;\n const relaySafety = classifyRemoteDelegateRelaySafety(explicitSession, ctx.mesh.id, node.id, dispatchCoordinatorDaemonId);\n if (relaySafety === 'unsafe_alias') {\n return buildRelayUnsafeRemoteSessionFailure(\n ctx,\n node,\n sessionId,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n if (relaySafety === 'missing_anchor') {\n return buildMissingCoordinatorDaemonIdFailure(\n ctx,\n node,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n // 'safe' or 'self_heal' → dispatch; the remote router stamps the relay\n // anchor from meshContext.coordinatorDaemonId when self-healing.\n if (!resolvedProviderType) {\n resolvedProviderType = resolveSessionProviderType(explicitSession);\n }\n } else if (!sessionId || args.session_id) {\n try {\n const relayResult = await transport.meshCommand(daemonId, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(relayResult);\n\n if (sessionId) {\n const explicitSession = sessions.find(session => readSessionRecordId(session) === sessionId);\n if (!explicitSession) {\n return {\n success: false,\n recoverable: true,\n code: 'mesh_target_session_not_found',\n reason: 'mesh_target_session_not_found',\n transport: 'mesh_transport',\n retryRecommended: true,\n meshId: ctx.mesh.id,\n nodeId: node.id,\n daemonId,\n workspace: node.workspace,\n sessionId,\n ...(resolvedProviderType ? { resolvedProviderType } : {}),\n error: `Remote session '${sessionId}' is not present in the live status for node '${node.id}'.`,\n nextAction: `Launch a fresh session with mesh_launch_session(node_id: '${node.id}'${resolvedProviderType ? `, type: '${resolvedProviderType}'` : ''}) or retry without session_id so Repo Mesh can target a live delegate session.`,\n };\n }\n const relaySafety = classifyRemoteDelegateRelaySafety(explicitSession, ctx.mesh.id, node.id, dispatchCoordinatorDaemonId);\n if (relaySafety === 'unsafe_alias') {\n return buildRelayUnsafeRemoteSessionFailure(\n ctx,\n node,\n sessionId,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n if (relaySafety === 'missing_anchor') {\n return buildMissingCoordinatorDaemonIdFailure(\n ctx,\n node,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\n // 'safe' or 'self_heal' → dispatch; the remote router stamps the\n // relay anchor from meshContext.coordinatorDaemonId when self-healing.\n if (!resolvedProviderType) {\n resolvedProviderType = resolveSessionProviderType(explicitSession);\n }\n } else {\n // Prefer live idle sessions launched for this mesh node. Never route\n // a new task into restored/stopped session records; that produces the\n // coordinator-visible \"pending only, chat never received it\" failure.\n const targetSession = chooseDispatchableSession(sessions, resolvedProviderType, ctx.mesh.id, node.id, dispatchCoordinatorDaemonId);\n\n if (targetSession?.id || targetSession?.sessionId) {\n sessionId = targetSession.id || targetSession.sessionId;\n if (!resolvedProviderType) {\n resolvedProviderType = resolveSessionProviderType(targetSession);\n }\n }\n }\n } catch (e: any) {\n if (sessionId) {\n return {\n ...buildCoordinatorP2pRelayFailure(e, {\n command: 'get_status_metadata',\n targetDaemonId: daemonId,\n nodeId: node.id,\n sessionId,\n }),\n success: false,\n error: `Cannot verify remote session '${sessionId}' before dispatch: ${e?.message || String(e)}`,\n };\n }\n // fall through — will attempt dispatch with just providerType (fuzzy)\n }\n }\n\n // agent_command requires agentType — fail if we cannot determine provider type\n if (!resolvedProviderType) {\n return { success: false, error: `Cannot dispatch to remote node '${node.id}': providerType unknown. Set providerPriority on the node policy or call mesh_launch_session first.` };\n }\n\n try {\n const dispatchResult = await transport.meshCommand(daemonId, 'agent_command', {\n ...(sessionId ? { targetSessionId: sessionId } : {}),\n agentType: resolvedProviderType,\n cliType: resolvedProviderType,\n action: 'send_chat',\n message: args.message,\n // WTCLAIM (B): carry the node workspace so a sessionless dispatch can be\n // scoped to THIS node's session on the worker (findAdapter dir match /\n // findMeshNodeAdapter). Without it, a worker hosting both a base node and a\n // cloned worktree node (same daemonId) would fall through to a provider-only\n // fuzzy match and could land worktree work on the base session.\n ...(node.workspace ? { dir: node.workspace } : {}),\n ...(args.meshContext ? { meshContext: args.meshContext } : {}),\n });\n const dispatchPayload = unwrapCommandPayload(dispatchResult);\n if (dispatchPayload?.success === false || dispatchResult?.success === false) {\n const source = dispatchPayload?.success === false ? dispatchPayload : dispatchResult;\n const errorMessage = dispatchPayload?.error || dispatchResult?.error || 'agent_command rejected the task';\n return {\n ...buildCoordinatorP2pRelayFailure(source?.error || errorMessage, {\n command: 'agent_command',\n targetDaemonId: daemonId,\n nodeId: node.id,\n sessionId,\n }),\n ...(source && typeof source === 'object' ? source : {}),\n success: false,\n error: `P2P dispatch failed: ${errorMessage}`,\n };\n }\n // Do NOT fall back to resolvedProviderType for sessionId: a sessionless\n // dispatch (no targetSessionId above) lets the worker pick/create the real\n // session, so the provider type ('claude-cli', …) is NOT a session id.\n // Returning it here used to poison assigned_session_id downstream, breaking\n // findAssignedBySession (provider type vs real session id) and orphaning the\n // task_completed match. Leave it empty so completion matching falls back to\n // taskId via the meshContext.taskId carried in the dispatch.\n return { success: true, dispatched: true, sessionId: sessionId || '', providerType: resolvedProviderType };\n } catch (e: any) {\n const errorMessage = e?.message || String(e);\n return {\n ...buildCoordinatorP2pRelayFailure(e, {\n command: 'agent_command',\n targetDaemonId: daemonId,\n nodeId: node.id,\n sessionId,\n }),\n error: `P2P dispatch failed: ${errorMessage}`,\n };\n }\n}\n\nexport function meshSessionCacheKey(nodeId: string, runtimeSessionId: string): string {\n return `${nodeId}:${runtimeSessionId}`;\n}\n\nexport function rememberMeshSessionProviderMetadata(\n nodeId: string | undefined,\n runtimeSessionId: string | undefined,\n metadata: MeshSessionProviderMetadata,\n): void {\n const keyNodeId = readString(nodeId);\n const keySessionId = readString(runtimeSessionId);\n if (!keyNodeId || !keySessionId) return;\n const providerType = readString(metadata.providerType);\n const providerSessionId = readString(metadata.providerSessionId);\n if (!providerType && !providerSessionId) return;\n const existing = getSessionMetadata(meshSessionCacheKey(keyNodeId, keySessionId)) || { providerType: '' };\n meshSessionProviderMetadata.set(meshSessionCacheKey(keyNodeId, keySessionId), {\n providerType: providerType || existing.providerType,\n providerSessionId: providerSessionId || existing.providerSessionId,\n expiresAt: Date.now() + SESSION_PROVIDER_METADATA_TTL_MS,\n });\n}\n\nexport function rememberMeshSessionProviderMetadataFromEvent(event: any): void {\n const metadataEvent = event?.metadataEvent && typeof event.metadataEvent === 'object'\n ? event.metadataEvent as Record<string, unknown>\n : event && typeof event === 'object'\n ? event as Record<string, unknown>\n : {};\n const nodeId = readString(event?.nodeId) || readString(metadataEvent.nodeId) || readString(metadataEvent.meshNodeId);\n const sessionId = readString(metadataEvent.targetSessionId)\n || readString(metadataEvent.sessionId)\n || readString(metadataEvent.instanceId)\n || readString(event?.sessionId);\n rememberMeshSessionProviderMetadata(nodeId, sessionId, {\n providerType: readString(metadataEvent.providerType) || readString(event?.providerType) || '',\n providerSessionId: readString(metadataEvent.providerSessionId) || readString(event?.providerSessionId),\n });\n}\n\nexport function resolveMeshSessionProviderMetadataFromLedger(\n ctx: MeshContext,\n nodeId: string,\n runtimeSessionId: string,\n): MeshSessionProviderMetadata | undefined {\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 50 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n const payload = entry.payload && typeof entry.payload === 'object' && !Array.isArray(entry.payload)\n ? entry.payload as Record<string, unknown>\n : {};\n const entryNodeId = readString(entry.nodeId) || readString(payload.nodeId) || readString(payload.meshNodeId);\n if (entryNodeId && entryNodeId !== nodeId) continue;\n const entrySessionId = readString(entry.sessionId)\n || readString(payload.targetSessionId)\n || readString(payload.sessionId)\n || readString(payload.instanceId);\n if (entrySessionId !== runtimeSessionId) continue;\n const providerType = readString(entry.providerType) || readString(payload.providerType);\n const completionDiagnostic = payload.completionDiagnostic && typeof payload.completionDiagnostic === 'object' && !Array.isArray(payload.completionDiagnostic)\n ? payload.completionDiagnostic as Record<string, unknown>\n : {};\n const metadataEvent = payload.metadataEvent && typeof payload.metadataEvent === 'object' && !Array.isArray(payload.metadataEvent)\n ? payload.metadataEvent as Record<string, unknown>\n : {};\n const providerSessionId = readString(payload.providerSessionId)\n || readString(completionDiagnostic.providerSessionId)\n || readString(metadataEvent.providerSessionId);\n if (providerType || providerSessionId) {\n return { providerType: providerType || '', providerSessionId };\n }\n }\n return undefined;\n}\n\nexport function resolveMeshSessionProviderMetadata(\n ctx: MeshContext,\n nodeId: string,\n runtimeSessionId: string,\n): MeshSessionProviderMetadata | undefined {\n const cached = getSessionMetadata(meshSessionCacheKey(nodeId, runtimeSessionId));\n if (cached?.providerType || cached?.providerSessionId) return cached;\n const fromLedger = resolveMeshSessionProviderMetadataFromLedger(ctx, nodeId, runtimeSessionId);\n if (fromLedger) rememberMeshSessionProviderMetadata(nodeId, runtimeSessionId, fromLedger);\n return fromLedger;\n}\n\nexport function countUncommittedChanges(status: any): number {\n if (typeof status?.uncommittedChanges === 'number') return status.uncommittedChanges;\n const keys = ['staged', 'modified', 'untracked', 'deleted', 'renamed'];\n const counted = keys.reduce((sum, key) => sum + (Number.isFinite(Number(status?.[key])) ? Number(status[key]) : 0), 0);\n const conflicts = Array.isArray(status?.conflictFiles) ? status.conflictFiles.length : (status?.hasConflicts ? 1 : 0);\n return counted + conflicts;\n}\n\nexport function isGitStatusDirty(status: any): boolean {\n if (typeof status?.isDirty === 'boolean') return status.isDirty;\n if (typeof status?.dirty === 'boolean') return status.dirty;\n if (Array.isArray(status?.submodules) && status.submodules.some((submodule: any) => submodule?.dirty || submodule?.outOfSync || submodule?.error)) return true;\n return countUncommittedChanges(status) > 0;\n}\n\n\n// Large structured fields that bloat refine/batch ledger entries (each can carry a\n// full per-node validation plan + suggested config). In compact mode these are\n// summarized rather than dropped — full detail stays available via verbose=true /\n// mesh_reconcile_ledger.\n// (large-value compaction utils moved to ./mesh-tool-shared.ts)\n\nexport function slimLedgerPayload(payload: Record<string, unknown>): Record<string, unknown> {\n const slim: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(payload)) {\n if (k === 'message' || k === 'taskSummary') {\n slim[k] = typeof v === 'string' && v.length > 200 ? v.slice(0, 200) + '…' : v;\n } else if (k === 'evidence' || k === 'workerResult' || k === 'gitStatus' || k === 'validationResults') {\n // Skip large nested evidence objects — accessible via mesh_reconcile_ledger if needed.\n } else if (k === 'finalSummary') {\n slim[k] = typeof v === 'string' && v.length > 300 ? v.slice(0, 300) + '…' : v;\n } else if (LARGE_LEDGER_FIELD_KEYS.has(k)) {\n // plan / validationPlan / suggestedConfig / nested payload — these are the\n // refine_batch task_dispatched offenders that blow past the token limit.\n slim[k] = summarizeLargeLedgerField(k, v);\n } else {\n // Primary, key-agnostic defense: elide any oversized nested evidence blob\n // (validationSummary, result, patchEquivalence, submoduleReachability, and\n // any future large key) by serialized byte size. Small scalars/short fields\n // are returned as-is.\n slim[k] = elideLargeNestedValue(k, v);\n }\n }\n return slim;\n}\n\nexport function readRelatedRepos(node: LocalMeshNodeEntry): RepoMeshRelatedRepo[] {\n const raw = Array.isArray((node as any).relatedRepos)\n ? (node as any).relatedRepos\n : Array.isArray((node.policy as any)?.relatedRepos)\n ? (node.policy as any).relatedRepos\n : [];\n\n return raw\n .map((entry: any) => ({\n label: typeof entry?.label === 'string' ? entry.label.trim() : '',\n workspace: typeof entry?.workspace === 'string' ? entry.workspace.trim() : '',\n }))\n .filter((entry: RepoMeshRelatedRepo) => Boolean(entry.label && entry.workspace));\n}\n\nexport function summarizeRelatedRepoStatus(repo: RepoMeshRelatedRepo, status: any): Record<string, unknown> {\n const dirty = isGitStatusDirty(status);\n return {\n label: repo.label,\n workspace: repo.workspace,\n isGitRepo: status?.isGitRepo === true,\n branch: status?.branch ?? null,\n upstream: status?.upstream ?? null,\n upstreamStatus: typeof status?.upstreamStatus === 'string' ? status.upstreamStatus : (status?.upstream ? 'unchecked' : 'no_upstream'),\n upstreamFetchedAt: Number.isFinite(Number(status?.upstreamFetchedAt)) ? Number(status.upstreamFetchedAt) : null,\n upstreamFetchError: typeof status?.upstreamFetchError === 'string' ? status.upstreamFetchError : null,\n ahead: Number.isFinite(Number(status?.ahead)) ? Number(status.ahead) : 0,\n behind: Number.isFinite(Number(status?.behind)) ? Number(status.behind) : 0,\n dirty,\n uncommittedChanges: countUncommittedChanges(status),\n head: status?.headCommit ?? null,\n lastCommitSummary: status?.headMessage ?? null,\n ...(status?.reason ? { reason: status.reason } : {}),\n ...(status?.error ? { error: status.error } : {}),\n };\n}\n\nexport async function collectRelatedRepoStatuses(ctx: MeshContext, node: LocalMeshNodeEntry): Promise<Array<Record<string, unknown>>> {\n const relatedRepos = readRelatedRepos(node);\n if (!relatedRepos.length) return [];\n\n const results: Array<Record<string, unknown>> = [];\n for (const repo of relatedRepos) {\n try {\n const statusResult = await commandForNode(ctx, node, 'git_status', { workspace: repo.workspace, refreshUpstream: true });\n const status = extractGitStatus(statusResult);\n results.push(summarizeRelatedRepoStatus(repo, status));\n } catch (e: any) {\n results.push({\n label: repo.label,\n workspace: repo.workspace,\n error: e?.message || 'related repo status failed',\n });\n }\n }\n return results;\n}\n\nexport function findNodeByWorkspace(mesh: LocalMeshEntry, workspace: string): LocalMeshNodeEntry {\n const node = mesh.nodes.find(n => n.workspace === workspace);\n if (!node) throw new Error(`Workspace '${workspace}' is not a member of mesh '${mesh.name}'`);\n return node;\n}\n\nexport function readProviderPriority(policy: unknown): string[] {\n const raw = (policy as any)?.providerPriority;\n return Array.isArray(raw)\n ? raw.map((type: unknown) => typeof type === 'string' ? type.trim() : '').filter(Boolean)\n : [];\n}\n\n\n/**\n * Surface the capability tags a node can match against required_tags routing,\n * plus its operator-defined capability labels. Computed via the same\n * buildMeshNodeCapabilityTags the queue/dispatch matcher uses, so what the\n * coordinator sees is exactly what routing will match.\n *\n * - capabilityTags: the representative tag set (os=/arch=/converge= plus the\n * first declared provider's provider= tag and any worktree= tag). This is\n * what nodeSatisfiesRequiredTags compares against when no provider is pinned.\n * - capabilityTagsByProvider: per-provider tag sets, one per entry in the\n * node's providerPriority — the provider= tag differs by provider, so a tag\n * like provider=codex-cli only matches when that provider is launchable here.\n * - capabilities: the operator-defined capability labels persisted on the node\n * (already folded into capabilityTags; surfaced raw so operators can see\n * which tags they configured vs. which are auto-advertised).\n *\n * Note: os=/arch= reflect the TARGET node's own machine — for remote member\n * nodes these come from the platform/arch the member daemon stamped into its\n * node record at join time (node.userOverrides.platform/arch), falling back to\n * the local process platform/arch only for the coordinator's own / local\n * worktree nodes. This matches the matcher's behavior, so the exposed set is a\n * faithful preview of routing, not an independent re-derivation.\n */\nexport function buildNodeCapabilityExposure(node: LocalMeshNodeEntry): {\n capabilityTags: string[];\n capabilityTagsByProvider?: Record<string, string[]>;\n capabilities?: string[];\n} {\n const providers = readProviderPriority(node.policy);\n const capabilityTags = buildMeshNodeCapabilityTags(node);\n const exposure: {\n capabilityTags: string[];\n capabilityTagsByProvider?: Record<string, string[]>;\n capabilities?: string[];\n } = { capabilityTags };\n if (providers.length) {\n const byProvider: Record<string, string[]> = {};\n for (const provider of providers) {\n byProvider[provider] = buildMeshNodeCapabilityTags(node, provider);\n }\n exposure.capabilityTagsByProvider = byProvider;\n }\n const capabilities = Array.isArray(node.capabilities)\n ? node.capabilities.filter((tag): tag is string => typeof tag === 'string' && !!tag.trim())\n : [];\n if (capabilities.length) exposure.capabilities = capabilities;\n return exposure;\n}\n\nexport function readSpawnedSessionVisibility(policy: unknown): 'visible' | 'hidden' {\n return (policy as any)?.spawnedSessionVisibility === 'hidden' ? 'hidden' : 'visible';\n}\n\nexport function missingProviderPriorityMessage(nodeId: string): string {\n return `Node '${nodeId}' has no providerPriority policy; pass type explicitly or configure node.policy.providerPriority`;\n}\n\nexport function getNodeLaunchReadiness(node: LocalMeshNodeEntry): Record<string, unknown> {\n const bootstrap = (node as any).worktreeBootstrap;\n if ((node as any).isLocalWorktree && bootstrap?.status === 'failed' && bootstrap?.required !== false) {\n return {\n providerPriority: readProviderPriority(node.policy),\n launchReady: false,\n launchBlockedReason: 'worktree_bootstrap_failed',\n launchBlockedMessage: typeof bootstrap.error === 'string' && bootstrap.error.trim()\n ? bootstrap.error.trim()\n : 'Required worktree bootstrap failed; resolve it before launching an agent into this node.',\n worktreeBootstrap: bootstrap,\n };\n }\n\n const providerPriority = readProviderPriority(node.policy);\n if (providerPriority.length) {\n return {\n providerPriority,\n launchReady: true,\n };\n }\n\n return {\n providerPriority,\n launchReady: false,\n launchBlockedReason: 'missing_provider_priority',\n launchBlockedMessage: missingProviderPriorityMessage(node.id),\n };\n}\n\nexport function getWorktreeBootstrapLaunchBlock(node: LocalMeshNodeEntry, meshPolicy?: unknown): Record<string, unknown> | undefined {\n if (!(node as any).isLocalWorktree) return undefined;\n const bootstrap = (node as any).worktreeBootstrap;\n\n // M2-4 (opt-in): with policy.requireBootstrapBeforeLaunch, any non-ready\n // bootstrap state blocks the launch fail-closed - not just failures.\n const requireReady = !!(meshPolicy && typeof meshPolicy === 'object'\n && (meshPolicy as Record<string, unknown>).requireBootstrapBeforeLaunch === true);\n if (requireReady && bootstrap?.status !== 'ready') {\n return {\n success: false,\n code: 'bootstrap_not_ready',\n error: `Node '${node.id}' bootstrap state is '${bootstrap?.status ?? 'unknown'}' and mesh policy requireBootstrapBeforeLaunch is enabled.`,\n nodeId: node.id,\n worktreeBootstrap: bootstrap ?? null,\n recoveryHint: 'Run the worktree bootstrap (clone runOnClone or a refine with bootstrap inherit) until the node reports ready, or disable requireBootstrapBeforeLaunch.',\n };\n }\n\n if (bootstrap?.status !== 'failed' || bootstrap?.required === false) return undefined;\n return {\n success: false,\n code: 'worktree_bootstrap_failed',\n error: typeof bootstrap.error === 'string' && bootstrap.error.trim()\n ? bootstrap.error.trim()\n : `Node '${node.id}' has a failed required worktree bootstrap.`,\n nodeId: node.id,\n worktreeBootstrap: bootstrap,\n recoveryHint: 'Fix the configured worktree bootstrap command or remove/recreate the worktree node before launching an agent.',\n };\n}\n\nexport async function collectLiveStatusSessions(ctx: MeshContext, node: LocalMeshNodeEntry): Promise<any[]> {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n return extractStatusMetadataSessions(statusResult);\n } catch {\n return [];\n }\n}\n\n\n/**\n * One get_status_metadata probe → both the live session list and the daemon's\n * build stamp. Used by mesh_status so a single daemon-wide probe yields the\n * sessions AND the `daemonBuild` field (commit/version of the running daemon).\n */\nexport async function collectLiveStatusProbe(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n): Promise<{ sessions: any[]; daemonBuild?: { commit: string; commitShort: string; version: string; builtAt?: string } }> {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n return {\n sessions: extractStatusMetadataSessions(statusResult),\n daemonBuild: extractDaemonBuildInfo(statusResult),\n };\n } catch {\n return { sessions: [] };\n }\n}\n\nexport function extractDaemonBuildInfo(value: any): { commit: string; commitShort: string; version: string; builtAt?: string } | undefined {\n const payload = unwrapCommandPayload(value);\n const build = payload?.daemonBuild && typeof payload.daemonBuild === 'object'\n ? payload.daemonBuild\n : (value?.daemonBuild && typeof value.daemonBuild === 'object' ? value.daemonBuild : undefined);\n if (!build) return undefined;\n const commit = readString(build.commit);\n if (!commit) return undefined;\n return {\n commit,\n commitShort: readString(build.commitShort) || commit.slice(0, 7),\n version: readString(build.version) || 'unknown',\n ...(readString(build.builtAt) ? { builtAt: readString(build.builtAt) } : {}),\n };\n}\n\nexport async function collectMeshViewQueueNodesWithLiveSessions(ctx: MeshContext): Promise<any[]> {\n const nodes = await Promise.all(ctx.mesh.nodes.map(async (node) => {\n const liveSessions = await collectLiveStatusSessions(ctx, node);\n return liveSessions.length > 0\n ? { ...node, sessions: liveSessions }\n : node;\n }));\n return nodes;\n}\n\nexport function buildBranchConvergence(\n mesh: LocalMeshEntry,\n node: LocalMeshNodeEntry,\n status: any,\n dirty: boolean,\n uncommittedChanges: number,\n): Record<string, unknown> {\n const defaultBranch = readString(mesh.defaultBranch) ?? 'main';\n const branch = readString(status?.branch) ?? readString(node.worktreeBranch) ?? null;\n const ahead = readNumeric(status?.ahead);\n const behind = readNumeric(status?.behind);\n const upstream = readString(status?.upstream) ?? null;\n const upstreamStatus = readString(status?.upstreamStatus) ?? (upstream ? 'unchecked' : 'no_upstream');\n const hasConflicts = status?.hasConflicts === true || (Array.isArray(status?.conflictFiles) && status.conflictFiles.length > 0);\n const base = {\n defaultBranch,\n branch,\n upstream,\n upstreamStatus,\n ahead,\n behind,\n isWorktree: node.isLocalWorktree === true,\n isDefaultBranch: branch === defaultBranch,\n };\n\n if (status?.isGitRepo !== true) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'git_status_unavailable',\n nextStep: `Resolve git status for node '${node.id}' before marking the task complete.`,\n };\n }\n\n if (!branch) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'branch_unknown',\n nextStep: `Inspect node '${node.id}' git branch before deciding whether it is merged to ${defaultBranch}.`,\n };\n }\n\n if (hasConflicts || dirty || uncommittedChanges > 0) {\n return {\n ...base,\n status: 'not_mergeable',\n needsConvergence: true,\n reason: hasConflicts ? 'conflicts_present' : 'dirty_workspace',\n nextStep: `Commit, checkpoint, or resolve node '${node.id}' before any main convergence step.`,\n };\n }\n\n if (branch === defaultBranch) {\n if (upstream && upstreamStatus !== 'fresh') {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'default_branch_upstream_unverified',\n nextStep: `Refresh ${defaultBranch}'s upstream refs or resolve the fetch failure before declaring convergence complete for node '${node.id}'.`,\n };\n }\n if (ahead > 0 || behind > 0) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'default_branch_not_even_with_upstream',\n nextStep: `Bring ${defaultBranch} even with its upstream before declaring convergence complete.`,\n };\n }\n return {\n ...base,\n status: 'merged_to_main',\n needsConvergence: false,\n reason: 'clean_default_branch',\n nextStep: null,\n };\n }\n\n if (node.isLocalWorktree) {\n return {\n ...base,\n status: 'cleanup_candidate',\n needsConvergence: true,\n reason: 'clean_non_default_worktree_branch',\n nextStep: `Run mesh_refine_node(node_id: \"${node.id}\") or explicitly classify this worktree as blocked_review/not_mergeable before ending the task.`,\n };\n }\n\n if (upstream && upstreamStatus !== 'fresh') {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: 'feature_branch_upstream_unverified',\n nextStep: `Refresh branch '${branch}' upstream refs or resolve the fetch failure before deciding whether it is ready to merge into ${defaultBranch}.`,\n };\n }\n\n if (!upstream || ahead > 0 || behind > 0) {\n return {\n ...base,\n status: 'blocked_review',\n needsConvergence: true,\n reason: !upstream ? 'feature_branch_missing_upstream' : 'feature_branch_not_even_with_upstream',\n nextStep: `Push or reconcile branch '${branch}', then merge it into ${defaultBranch} or mark it not_mergeable with a reason.`,\n };\n }\n\n return {\n ...base,\n status: 'pushed_feature_branch_needs_merge',\n needsConvergence: true,\n reason: 'clean_non_default_branch',\n nextStep: `Review and merge branch '${branch}' into ${defaultBranch}; do not report the task as fully complete while it remains off main.`,\n };\n}\n\n\n// In compact mode the per-node followUp rows are capped so this summary can't grow\n// unbounded with node count; the dropped rows are folded into a by-status count and\n// the full list stays available via verbose.\nexport const COMPACT_MAX_CONVERGENCE_FOLLOWUPS = 12;\n\nexport function summarizeBranchConvergence(nodes: any[], compact = false): Record<string, unknown> {\n const allFollowUps = nodes\n .filter(node => node?.branchConvergence?.needsConvergence === true)\n .map(node => ({\n nodeId: node.nodeId,\n // workspace is a long absolute path redundant with nodeId — drop it in\n // compact mode to keep this summary bounded.\n ...(compact ? {} : { workspace: node.workspace }),\n branch: node.branchConvergence.branch,\n status: node.branchConvergence.status,\n reason: node.branchConvergence.reason,\n // The per-node nextStep is long prose that repeats node ids/branch names.\n // In compact mode drop it (the status+reason carry the actionable signal;\n // verbose still surfaces the full nextStep) so this summary stays bounded\n // as node count grows.\n ...(compact ? {} : { nextStep: node.branchConvergence.nextStep }),\n }));\n\n const byStatus: Record<string, number> = {};\n for (const f of allFollowUps) {\n const s = typeof f.status === 'string' ? f.status : 'unknown';\n byStatus[s] = (byStatus[s] ?? 0) + 1;\n }\n\n const followUps = compact ? allFollowUps.slice(0, COMPACT_MAX_CONVERGENCE_FOLLOWUPS) : allFollowUps;\n const omitted = allFollowUps.length - followUps.length;\n\n return {\n needsFollowUp: allFollowUps.length > 0,\n unresolvedCount: allFollowUps.length,\n byStatus,\n requiredFinalStates: ['merged_to_main', 'pushed_feature_branch_needs_merge', 'blocked_review', 'cleanup_candidate', 'not_mergeable'],\n followUps,\n ...(omitted > 0 ? { followUpsOmitted: omitted, followUpsHint: 'Per-node followUp rows are capped in compact mode; counts above are complete. Use verbose=true for the full list.' } : {}),\n };\n}\n\nexport async function commandForNode(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n command: string,\n args: Record<string, unknown> = {},\n): Promise<any> {\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n\n if (ctx.transport instanceof IpcTransport && node.daemonId && !isLocalNode) {\n return ctx.transport.meshCommand(node.daemonId, command, args);\n }\n return ctx.transport.command(command, args);\n}\n\nexport function normalizePendingMeshCoordinatorEvents(value: any): any[] {\n const payload = unwrapCommandPayload(value);\n const events = Array.isArray(payload?.events)\n ? payload.events\n : Array.isArray(value?.events)\n ? value.events\n : [];\n return events.filter((event: unknown) => event && typeof event === 'object');\n}\n\nexport function buildMeshForwardPayloadFromPendingEvent(event: any): Record<string, unknown> {\n const metadataEvent = event?.metadataEvent && typeof event.metadataEvent === 'object'\n ? event.metadataEvent as Record<string, unknown>\n : {};\n return {\n event: readString(event?.event),\n meshId: readString(event?.meshId),\n nodeId: readString(event?.nodeId) || readString(metadataEvent.meshNodeId),\n workspace: readString(event?.workspace) || readString(metadataEvent.workspace),\n targetSessionId: readString(metadataEvent.targetSessionId) || readString(metadataEvent.sessionId) || readString(metadataEvent.instanceId),\n providerType: readString(metadataEvent.providerType),\n providerSessionId: readString(metadataEvent.providerSessionId),\n finalSummary: readString(metadataEvent.finalSummary) || readString(metadataEvent.summary),\n jobId: readString(metadataEvent.jobId),\n interactionId: readString(metadataEvent.interactionId),\n status: readString(metadataEvent.status),\n targetDaemonId: readString(metadataEvent.targetDaemonId),\n startedAt: readString(metadataEvent.startedAt),\n completedAt: readString(metadataEvent.completedAt),\n retryOfJobId: readString(metadataEvent.retryOfJobId),\n ...(metadataEvent.result && typeof metadataEvent.result === 'object' && !Array.isArray(metadataEvent.result) ? { result: metadataEvent.result } : {}),\n ...(metadataEvent.intentional === true ? { intentional: true } : {}),\n ...(metadataEvent.intentionalStop === true ? { intentionalStop: true } : {}),\n ...(metadataEvent.operatorCleanup === true ? { operatorCleanup: true } : {}),\n ...(readString(metadataEvent.reason) ? { reason: readString(metadataEvent.reason) } : {}),\n ...(readString(metadataEvent.stopReason) ? { stopReason: readString(metadataEvent.stopReason) } : {}),\n ...(readString(metadataEvent.cleanupReason) ? { cleanupReason: readString(metadataEvent.cleanupReason) } : {}),\n ...(readString(metadataEvent.source) ? { source: readString(metadataEvent.source) } : {}),\n };\n}\n\nexport async function drainCoordinatorPendingEvents(\n ctx: MeshContext,\n opts?: { nodeIds?: string[] },\n): Promise<any[]> {\n const requestedNodeIds = opts?.nodeIds?.length ? new Set(opts.nodeIds) : null;\n const matchesCurrentMesh = (event: any) => readString(event?.meshId) === ctx.mesh.id;\n\n if (ctx.transport instanceof IpcTransport) {\n const surfacedEvents: any[] = [];\n const coordinatorDaemonId = readString(ctx.localDaemonId);\n const pendingEventArgs = {\n meshId: ctx.mesh.id,\n ...(coordinatorDaemonId ? { coordinatorDaemonId } : {}),\n };\n\n try {\n const localEvents = normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', pendingEventArgs) as any)\n .filter(matchesCurrentMesh);\n for (const event of localEvents) {\n const payload = buildMeshForwardPayloadFromPendingEvent(event);\n if (!payload.event || !payload.meshId) continue;\n let injected = false;\n try {\n await ctx.transport.command('mesh_forward_event', payload);\n injected = true;\n } catch { /* best-effort */ }\n rememberMeshSessionProviderMetadataFromEvent({ ...event, metadataEvent: payload });\n if (!injected) surfacedEvents.push(event);\n }\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n for (const node of ctx.mesh.nodes) {\n if (!node.daemonId || isLocalControlPlaneNode(ctx, node)) continue;\n if (requestedNodeIds && !requestedNodeIds.has(node.id)) continue;\n\n try {\n const remoteEvents = normalizePendingMeshCoordinatorEvents(\n await ctx.transport.meshCommand(node.daemonId, 'get_pending_mesh_events', pendingEventArgs),\n ).filter(matchesCurrentMesh);\n if (remoteEvents.length === 0) continue;\n\n for (const event of remoteEvents) {\n const payload = buildMeshForwardPayloadFromPendingEvent(event);\n if (!payload.event || !payload.meshId) continue;\n await ctx.transport.command('mesh_forward_event', payload);\n rememberMeshSessionProviderMetadataFromEvent({ ...event, metadataEvent: payload });\n }\n } catch {\n // Non-fatal: remote pending-event recovery is best-effort.\n }\n }\n\n try {\n const localEvents = normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', pendingEventArgs) as any)\n .filter(matchesCurrentMesh);\n for (const event of localEvents) {\n const payload = buildMeshForwardPayloadFromPendingEvent(event);\n if (!payload.event || !payload.meshId) continue;\n let injected = false;\n try {\n await ctx.transport.command('mesh_forward_event', payload);\n injected = true;\n } catch { /* best-effort */ }\n rememberMeshSessionProviderMetadataFromEvent({ ...event, metadataEvent: payload });\n if (!injected) surfacedEvents.push(event);\n }\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n return surfacedEvents;\n }\n\n // (B3) Pass localDaemonId so unicast events targeted at other\n // coordinators are skipped (and requeued) instead of being silently\n // consumed by this MCP. drainPendingMeshCoordinatorEvents already\n // accepts the second arg in the base; we were the missing wiring.\n const events = (drainPendingMeshCoordinatorEvents(ctx.mesh.id, ctx.localDaemonId) as any[]).filter(matchesCurrentMesh);\n events.forEach(rememberMeshSessionProviderMetadataFromEvent);\n return events;\n}\n\nexport function isP2pTransportUnavailableError(error: unknown): boolean {\n return isP2pRelayTransportFailure(error);\n}\n\nexport function buildRemoveNodeArgs(ctx: MeshContext, nodeId: string, sessionCleanupMode?: string, force?: boolean): Record<string, unknown> {\n return {\n meshId: ctx.mesh.id,\n nodeId,\n ...(sessionCleanupMode ? { sessionCleanupMode } : {}),\n ...(force === true ? { force: true } : {}),\n inlineMesh: ctx.mesh,\n };\n}\n\n\n/**\n * Distinguish a P2P read_chat transport failure between \"the peer is reachable but\n * saturated/slow\" (REQUEST_TIMEOUT — acked, result deadline elapsed) and \"the peer was\n * never connected / the request never reached a working handler\" (CONNECT_TIMEOUT,\n * ACK_TIMEOUT delivery failure, NO_PEER, datachannel closed, …). Both still warrant the\n * cached-summary fallback, but the advisory wording differs so the coordinator knows\n * whether a quick retry is plausible (saturated) or the daemon is simply offline.\n *\n * The transport-layer code (meshCode) is lost crossing IPC — only the error message\n * string survives — so classification is by message text.\n */\nexport function classifyReadChatTransportCause(error: unknown): 'not_connected' | 'saturated' {\n const message = (error instanceof Error ? error.message : String(error ?? '')).toLowerCase();\n if (/not acknowledged|delivery failure|channel never opened|connect timed out|not connected|datachannel|disconnected|\\bclosed\\b|offline|no route|failed to initiate p2p|p2p mesh is not available|connect queue full/.test(message)) {\n return 'not_connected';\n }\n // Acked but the result deadline elapsed (REQUEST_TIMEOUT) — peer reachable but\n // saturated / still working and could not return the transcript in time.\n return 'saturated';\n}\n\n\n/**\n * The coordinator already holds the worker's latest assistant text from the completion /\n * status events it surfaced into the ledger (finalSummary / workerResult.summary — the\n * same fields resolveMeshSurfacedSessionPreview reads off a live event, and the same\n * data the mobile inbox is fed). When the live P2P read_chat path is unavailable this\n * resolves that cached preview so mesh_read_chat can degrade to a stale-but-present\n * summary instead of a hard 30s timeout. Scans the most recent matching ledger entry for\n * the node+session.\n */\nexport function resolveCachedMeshSessionPreviewFromLedger(\n ctx: MeshContext,\n nodeId: string,\n sessionId: string,\n): { preview: string; role: 'assistant'; receivedAt: number; ledgerKind: string; timestamp: string } | undefined {\n const entries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const entry = entries[i];\n const payload = entry.payload && typeof entry.payload === 'object' && !Array.isArray(entry.payload)\n ? entry.payload as Record<string, unknown>\n : {};\n const entryNodeId = readString(entry.nodeId) || readString(payload.nodeId) || readString(payload.meshNodeId);\n if (entryNodeId && entryNodeId !== nodeId) continue;\n const entrySessionId = readString(entry.sessionId)\n || readString(payload.targetSessionId)\n || readString(payload.sessionId)\n || readString(payload.instanceId);\n if (entrySessionId !== sessionId) continue;\n // Prefer a nested metadataEvent when present, else read the entry payload itself\n // (task_completed / task_failed entries carry finalSummary + workerResult inline).\n const metadataEvent = payload.metadataEvent && typeof payload.metadataEvent === 'object' && !Array.isArray(payload.metadataEvent)\n ? payload.metadataEvent as Record<string, unknown>\n : payload;\n const preview = resolveMeshSurfacedSessionPreview(metadataEvent);\n if (preview) {\n return { ...preview, ledgerKind: entry.kind, timestamp: entry.timestamp };\n }\n }\n return undefined;\n}\n\n\n/**\n * mesh_read_chat fallback for a REMOTE P2P read that failed at the transport layer.\n *\n * Mirrors mesh_status's collectLiveStatusProbe graceful-degrade pattern: rather than\n * hard-failing on a 30s P2P timeout to a saturated/unreachable worker, surface the\n * cached coordinator-side summary (the same finalSummary/lastMessagePreview the mobile\n * dashboard renders). This is a READ/meta-plane degrade — status & preview already flow\n * over the WS/event plane — NOT a data-plane command WS fallback (which stays P2P-only\n * by policy). The full transcript still requires a live P2P read_chat; the fallback is\n * explicitly a stale point-in-time summary only.\n */\nexport function buildMeshReadChatCacheFallback(\n ctx: MeshContext,\n args: { node_id: string; session_id: string },\n node: LocalMeshNodeEntry,\n error: unknown,\n): string {\n const classification = classifyP2pRelayFailure(error, { command: 'read_chat', targetDaemonId: node.daemonId });\n const cause = classifyReadChatTransportCause(error);\n const errorMessage = error instanceof Error ? error.message : String(error ?? '');\n const causeNote = cause === 'not_connected'\n ? 'the worker daemon is not currently connected over P2P (no live channel)'\n : 'the worker daemon is connected but saturated — it acknowledged the request but did not return the transcript within the deadline';\n\n const cached = resolveCachedMeshSessionPreviewFromLedger(ctx, args.node_id, args.session_id);\n if (cached) {\n return JSON.stringify({\n success: true,\n source: 'coordinator_cache_fallback',\n fallback: true,\n nodeId: args.node_id,\n sessionId: args.session_id,\n transport: 'p2p',\n transportFailure: {\n code: classification.code,\n reason: classification.reason,\n cause,\n error: errorMessage,\n },\n advisory: `Live transcript unavailable (${causeNote}). Showing the cached coordinator-side summary surfaced from the worker's last completion/status event — a stale point-in-time summary, NOT the live transcript. The full transcript requires a live P2P read_chat once the peer is reachable.`,\n fullTranscriptRequiresP2p: true,\n summary: cached.preview,\n messages: [{\n role: cached.role,\n content: cached.preview,\n cached: true,\n ...(cached.receivedAt ? { receivedAt: cached.receivedAt } : {}),\n }],\n cachedPreview: {\n role: cached.role,\n ledgerKind: cached.ledgerKind,\n ledgerTimestamp: cached.timestamp,\n ...(cached.receivedAt ? { receivedAt: cached.receivedAt } : {}),\n },\n }, null, 2);\n }\n\n // No cached summary either — return the structured relay failure with a clear reason,\n // and make explicit that even a fallback summary is unavailable.\n const failure = buildCoordinatorP2pRelayFailure(error, {\n command: 'read_chat',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n sessionId: args.session_id,\n });\n return JSON.stringify({\n ...failure,\n cause,\n cachedSummaryAvailable: false,\n fullTranscriptRequiresP2p: true,\n advisory: `Live transcript unavailable (${causeNote}) and no cached coordinator-side summary exists for this session yet (no completion/status event has been surfaced). The full transcript requires a live P2P read_chat once the peer is reachable.`,\n }, null, 2);\n}\n\nexport function resolveRefineConfigNode(ctx: MeshContext, nodeId?: string): LocalMeshNodeEntry {\n if (nodeId) return findNode(ctx.mesh, nodeId);\n const node = ctx.mesh.nodes.find((entry: LocalMeshNodeEntry) => !!entry.workspace);\n if (!node) throw new Error('No mesh node with a workspace is available');\n return node;\n}\n","/**\n * Shared low-level helpers and constants for the mesh_* tool family.\n *\n * Leaf module: depends only on daemon-core/mesh-shared (never on mesh-tools.ts or\n * any of the split-out cluster files), so the cluster files (mesh-compact.ts,\n * mesh-queue-helpers.ts, mesh-node-identity.ts) and mesh-tools.ts can all import\n * from here without a runtime import cycle. Physically split out of mesh-tools.ts\n * (RF-SURVEY candidate C1) with no behavior change — same function bodies, same\n * constant values.\n */\n\nexport function readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport function readNumeric(value: unknown, fallback = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\n// ─── Large-value / ledger-field compaction (shared by queue + compact + ledger) ───\n\nexport const LARGE_LEDGER_FIELD_KEYS = new Set(['plan', 'validationPlan', 'suggestedConfig', 'payload']);\nconst LARGE_LEDGER_OBJECT_THRESHOLD = 800;\n// Any nested object/array in a compact payload whose serialized size exceeds this\n// is replaced with an elided placeholder. This is the PRIMARY defense: it covers\n// arbitrary evidence keys (validationSummary, result, patchEquivalence,\n// submoduleReachability, plus any future key) without a hardcoded allowlist. The\n// specific per-key rules below are just tuning on top of this general guard.\nconst LARGE_LEDGER_NESTED_BYTES_THRESHOLD = 2000;\n\nexport function summarizeLargeLedgerField(key: string, value: unknown): unknown {\n if (typeof value === 'string') {\n return value.length > 500 ? value.slice(0, 500) + '…' : value;\n }\n if (Array.isArray(value)) {\n const serialized = JSON.stringify(value);\n if (serialized && serialized.length > LARGE_LEDGER_OBJECT_THRESHOLD) {\n return `[${key} summarized: ${value.length} items — use verbose=true or mesh_reconcile_ledger]`;\n }\n return value;\n }\n if (value && typeof value === 'object') {\n const serialized = JSON.stringify(value);\n if (serialized && serialized.length > LARGE_LEDGER_OBJECT_THRESHOLD) {\n return `[${key} summarized: ${Object.keys(value as Record<string, unknown>).length} keys — use verbose=true or mesh_reconcile_ledger]`;\n }\n return value;\n }\n return value;\n}\n\n// Generic nested-value guard. Replaces any object/array (or oversized string) whose\n// serialized size exceeds LARGE_LEDGER_NESTED_BYTES_THRESHOLD with a compact\n// placeholder that records the original key, byte size, and a recovery hint. Small\n// scalars and short fields (source, success, async, into, mergedBranch, …) pass\n// through untouched.\nexport function elideLargeNestedValue(key: string, value: unknown): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'string') {\n // Long bare strings (not one of the explicitly-capped fields) get a hard cap\n // so a single multi-KB string blob can't blow the payload either.\n return value.length > 1000 ? value.slice(0, 1000) + '…' : value;\n }\n if (typeof value !== 'object') return value; // number / boolean\n const serialized = JSON.stringify(value);\n const bytes = serialized ? serialized.length : 0;\n if (bytes <= LARGE_LEDGER_NESTED_BYTES_THRESHOLD) return value;\n return {\n _elided: true,\n _kind: key,\n _bytes: bytes,\n _hint: 'full evidence via mesh_reconcile_ledger',\n };\n}\n","/**\n * Session / command-payload record helpers for the mesh_* tools.\n *\n * Leaf module: depends only on mesh-tool-shared (readString). Holds the shared\n * session-record readers/classifiers (id/provider/coordinator/unmanaged/terminal/\n * idle), the node session-id collector, and the command-payload unwrapper.\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change — same function bodies. mesh-tools.ts and the queue/compact cluster files\n * import these back, so there is no runtime import cycle.\n */\nimport { readString } from './mesh-tool-shared.js';\n\nexport function readSessionRecordId(session: any): string | undefined {\n return readString(session?.id)\n || readString(session?.sessionId)\n || readString(session?.session_id)\n || readString(session?.runtimeSessionId)\n || readString(session?.runtime_session_id)\n || readString(session?.instanceId)\n || readString(session?.instance_id);\n}\n\nexport function extractStatusMetadataSessions(value: any): any[] {\n const payload = unwrapCommandPayload(value);\n const status = payload?.status && typeof payload.status === 'object'\n ? payload.status\n : payload;\n return Array.isArray(status?.sessions) ? status.sessions : [];\n}\n\nexport function resolveSessionProviderType(session: any): string {\n return readString(session?.providerType)\n || readString(session?.cliType)\n || readString(session?.agentType)\n || '';\n}\n\nexport function isMeshCoordinatorSessionRecord(session: any): boolean {\n return Boolean(\n readString(session?.settings?.meshCoordinatorFor)\n || readString(session?.meta?.meshCoordinatorFor)\n || readString(session?.metadata?.meshCoordinatorFor)\n || readString(session?.meshCoordinatorFor),\n );\n}\n\n/**\n * Returns true when a session has no mesh delegation metadata at all — neither\n * meshNodeFor (worker) nor meshCoordinatorFor (coordinator). Dispatching a\n * worker task to such a session is unsafe: the session may be the coordinator's\n * own CLI session (self-send risk), an unrelated session, or a stale record\n * whose providerSessionId now aliases the coordinator's transcript.\n *\n * The check intentionally fails closed: an explicit delegate session launched\n * via mesh_launch_session always carries meshNodeFor, so any safe target passes.\n */\nexport function isUnmanagedSessionRecord(session: any): boolean {\n const hasMeshNodeFor = Boolean(\n readString(session?.settings?.meshNodeFor)\n || readString(session?.meta?.meshNodeFor)\n || readString(session?.metadata?.meshNodeFor)\n || readString(session?.meshNodeFor),\n );\n if (hasMeshNodeFor) return false;\n if (isMeshCoordinatorSessionRecord(session)) return false;\n // launchedByCoordinator is set by the daemon when it auto-launches a worker\n // session in response to a queue task; treat it as a managed delegate.\n const launchedByCoordinator = Boolean(\n session?.settings?.launchedByCoordinator === true\n || session?.meta?.launchedByCoordinator === true\n || session?.launchedByCoordinator === true,\n );\n return !launchedByCoordinator;\n}\n\nexport function isWorkerTaskMode(taskMode: string | undefined): boolean {\n return taskMode !== 'live_debug_readonly';\n}\n\nfunction addSessionRecord(target: Set<string>, session: any): void {\n if (!session || typeof session !== 'object' || isTerminalSessionRecord(session)) return;\n const sessionId = readSessionRecordId(session);\n if (sessionId) target.add(sessionId);\n}\n\nexport function collectNodeSessionIds(node: any): Set<string> {\n const sessions = new Set<string>();\n const sessionArrays = [\n node?.sessions,\n node?.activeSessions,\n node?.active_sessions,\n node?.lastProbe?.sessions,\n node?.last_probe?.sessions,\n node?.lastProbe?.status?.sessions,\n node?.last_probe?.status?.sessions,\n ];\n for (const value of sessionArrays) {\n if (Array.isArray(value)) value.forEach(session => addSessionRecord(sessions, session));\n }\n\n const sessionRecords = [\n node?.activeSession,\n node?.active_session,\n node?.currentSession,\n node?.current_session,\n node?.runtimeSession,\n node?.runtime_session,\n node?.session,\n node?.lastProbe?.activeSession,\n node?.last_probe?.active_session,\n node?.lastProbe?.currentSession,\n node?.last_probe?.current_session,\n node?.lastProbe?.session,\n node?.last_probe?.session,\n ];\n sessionRecords.forEach(session => addSessionRecord(sessions, session));\n return sessions;\n}\n\nexport function unwrapCommandPayload(value: any): any {\n let current = value;\n const seen = new Set<any>();\n for (let depth = 0; depth < 8; depth += 1) {\n if (!current || typeof current !== 'object' || seen.has(current)) break;\n seen.add(current);\n\n const nested = current.result ?? current.payload;\n if (!nested || typeof nested !== 'object') break;\n current = nested;\n }\n return current;\n}\n\nexport function isTerminalSessionRecord(session: any): boolean {\n const status = typeof session?.status === 'string' ? session.status.toLowerCase() : '';\n const lifecycle = typeof session?.lifecycle === 'string' ? session.lifecycle.toLowerCase() : '';\n const state = typeof session?.state === 'string' ? session.state.toLowerCase() : '';\n return [status, lifecycle, state].some(value => ['stopped', 'failed', 'terminated', 'exited', 'closed'].includes(value));\n}\n\nexport function isIdleSessionRecord(session: any): boolean {\n if (isTerminalSessionRecord(session)) return false;\n const status = typeof session?.status === 'string' ? session.status.toLowerCase() : '';\n const chatStatus = typeof session?.activeChat?.status === 'string' ? session.activeChat.status.toLowerCase() : '';\n return status === 'idle' || chatStatus === 'waiting_input';\n}\n","/**\n * Node identity / locality resolution helpers for the mesh_* tools.\n *\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change. Resolves machine/daemon/hostname identity for a mesh node and decides\n * whether a node is the local control-plane / coordinator node. Imports only leaf\n * deps (mesh-tool-shared, daemon-core) plus the MeshContext type (type-only, so no\n * runtime import cycle); mesh-tools.ts imports the exported helpers back.\n */\nimport { daemonIdsEquivalent, meshNodeIdMatches } from '@adhdev/daemon-core';\nimport type { LocalMeshNodeEntry } from '@adhdev/daemon-core';\nimport { readString } from './mesh-tool-shared.js';\nimport type { MeshContext } from './mesh-tools.js';\n\nexport function resolveCoordinatorNode(ctx: MeshContext): LocalMeshNodeEntry | undefined {\n const preferredNodeId = typeof ctx.mesh.coordinator?.preferredNodeId === 'string'\n ? ctx.mesh.coordinator.preferredNodeId.trim()\n : '';\n if (preferredNodeId) {\n const preferred = ctx.mesh.nodes.find(n => n.id === preferredNodeId && typeof n.daemonId === 'string' && n.daemonId.trim());\n if (preferred) return preferred;\n }\n if (ctx.localMachineId) {\n const byMachine = ctx.mesh.nodes.find(n => readNodeMachineId(n) === ctx.localMachineId);\n if (byMachine) return byMachine;\n }\n if (ctx.localDaemonId) {\n return ctx.mesh.nodes.find(n => readNodeDaemonId(n) === ctx.localDaemonId);\n }\n return undefined;\n}\n\n/**\n * Resolve the coordinator anchor id stamped into a worker dispatch's meshContext\n * (`coordinatorDaemonId`), which the remote router turns into the worker\n * session's `meshCoordinatorDaemonId` relay anchor (router.ts buildMeshWorkerRelayStamp).\n * Without a non-empty value the forwarder gate treats the worker as relay-unsafe\n * and the completion event sits in the pending queue until a later read_chat\n * forces a reconcile.\n *\n * Order: the coordinator mesh node's daemonId → the IPC daemon instanceId\n * (ctx.localDaemonId) → the local machine registry id (ctx.localMachineId). The\n * final fallback mirrors the queue-assignment dispatch path, which stamps\n * `loadConfig().machineId` (== ctx.localMachineId; see server.ts) — so the\n * direct-dispatch path now resolves an anchor whenever the queue path would.\n */\nexport function resolveCoordinatorDaemonId(ctx: MeshContext): string | undefined {\n return readString(resolveCoordinatorNode(ctx)?.daemonId)\n || readString(ctx.localDaemonId)\n || readString(ctx.localMachineId);\n}\n\nexport function readNodeMachineId(node: LocalMeshNodeEntry): string | undefined {\n return readString((node as any).machineId)\n || readString((node as any).machine_id)\n || readString((node as any).machine?.id)\n || readString((node as any).machine?.machineId)\n || readString((node as any).lastProbe?.machineId)\n || readString((node as any).last_probe?.machine_id)\n || readString((node as any).lastProbe?.machine?.id)\n || readString((node as any).lastProbe?.machine?.machineId)\n || readString((node as any).last_probe?.machine?.id)\n || readString((node as any).last_probe?.machine?.machine_id);\n}\n\nexport function readNodeDaemonId(node: LocalMeshNodeEntry): string | undefined {\n return readString(node.daemonId)\n || readString((node as any).daemon_id)\n || readString((node as any).machine?.daemonId)\n || readString((node as any).machine?.daemon_id)\n || readString((node as any).lastProbe?.daemonId)\n || readString((node as any).last_probe?.daemon_id)\n || readString((node as any).lastProbe?.machine?.daemonId)\n || readString((node as any).lastProbe?.machine?.daemon_id)\n || readString((node as any).last_probe?.machine?.daemonId)\n || readString((node as any).last_probe?.machine?.daemon_id);\n}\n\nfunction normalizeHostname(value: unknown): string | undefined {\n const hostname = readString(value);\n if (!hostname) return undefined;\n return hostname.toLowerCase().replace(/\\.$/, '');\n}\n\nfunction readNodeHostname(node: LocalMeshNodeEntry): string | undefined {\n return readString((node as any).hostname)\n || readString((node as any).host)\n || readString((node as any).machineHostname)\n || readString((node as any).machine_hostname)\n || readString((node as any).machine?.hostname)\n || readString((node as any).machine?.host)\n || readString((node as any).lastProbe?.hostname)\n || readString((node as any).last_probe?.hostname)\n || readString((node as any).lastProbe?.machine?.hostname)\n || readString((node as any).last_probe?.machine?.hostname);\n}\n\nfunction readNodeDisplayMachineName(node: LocalMeshNodeEntry): string | undefined {\n return readString((node as any).machineName)\n || readString((node as any).machine_name)\n || readString((node as any).machineLabel)\n || readString((node as any).machine_label)\n || readString((node as any).machineNickname)\n || readString((node as any).machine_nickname)\n || readString((node as any).alias)\n || readString((node as any).machine?.name)\n || readString((node as any).machine?.displayName)\n || readString((node as any).machine?.display_name)\n || readString((node as any).lastProbe?.machineName)\n || readString((node as any).last_probe?.machine_name)\n || readString((node as any).lastProbe?.machine?.name)\n || readString((node as any).last_probe?.machine?.name)\n || readNodeHostname(node);\n}\n\nfunction compactIdentityEvidence(value: string | undefined): string | undefined {\n if (!value) return undefined;\n return value.length > 24 ? `${value.slice(0, 12)}…${value.slice(-8)}` : value;\n}\n\nfunction pushIdentityEvidence(evidence: string[], label: string, value: string | undefined): void {\n const compact = compactIdentityEvidence(value);\n if (compact) evidence.push(`${label}:${compact}`);\n}\n\nexport function buildNodeMachineIdentity(ctx: MeshContext, node: LocalMeshNodeEntry): Record<string, unknown> {\n const machineId = readNodeMachineId(node);\n const daemonId = readNodeDaemonId(node);\n const hostname = readNodeHostname(node);\n const machineName = readNodeDisplayMachineName(node);\n const coordinatorHostname = readString(ctx.coordinatorHostname);\n const localControlPlaneReason = getLocalControlPlaneMatchReason(ctx, node);\n const directLocal = !!localControlPlaneReason;\n const hostnameMatches = Boolean(\n normalizeHostname(hostname)\n && normalizeHostname(coordinatorHostname)\n && normalizeHostname(hostname) === normalizeHostname(coordinatorHostname),\n );\n const sameMachine = directLocal || hostnameMatches;\n const evidence: string[] = [];\n pushIdentityEvidence(evidence, 'machineName', machineName);\n pushIdentityEvidence(evidence, 'hostname', hostname);\n pushIdentityEvidence(evidence, 'machineId', machineId);\n pushIdentityEvidence(evidence, 'daemonId', daemonId);\n if (localControlPlaneReason) {\n pushIdentityEvidence(evidence, 'localMatch', localControlPlaneReason);\n pushIdentityEvidence(evidence, 'localMachineId', ctx.localMachineId);\n pushIdentityEvidence(evidence, 'localDaemonId', ctx.localDaemonId);\n }\n const locality = sameMachine ? 'same_machine' : (evidence.length > 0 ? 'remote_known' : 'remote_or_unknown');\n const localityReason = sameMachine\n ? (localControlPlaneReason || 'matched coordinator hostname')\n : evidence.length > 0\n ? `known remote/other machine identity; no local coordinator match (${evidence.join(', ')})`\n : 'no useful machine identity evidence available';\n return {\n daemonId,\n machineId,\n hostname,\n machineName,\n displayName: machineName || hostname || daemonId || machineId,\n coordinatorHostname,\n sameMachine,\n locality,\n localityReason,\n identityEvidence: evidence,\n };\n}\n\nfunction nodeHasLocalDaemonEvidence(ctx: MeshContext, node: any): boolean {\n const isLocal = (session: any) => {\n if (!session || typeof session !== 'object') return false;\n // meshCoordinatorDaemonId identifies where a worker should relay completion events.\n // Remote workers also point this at the local coordinator, so it is not locality evidence.\n // Likewise launchedByCoordinator only proves the coordinator created the session, not\n // that the session is running on this daemon.\n // runtime.owner / daemonClient.daemonId and ctx.localDaemonId may carry\n // interchangeable id forms (bare mach_ / daemon_mach_ / standalone_mach_), so\n // compare under canonical machine-core form rather than a raw ===; a form\n // mismatch would otherwise drop valid local-daemon evidence.\n if (ctx.localDaemonId && daemonIdsEquivalent(session.runtime?.owner, ctx.localDaemonId)) return true;\n if (ctx.localDaemonId && daemonIdsEquivalent(session.daemonClient?.daemonId, ctx.localDaemonId)) return true;\n return false;\n };\n\n const sessionArrays = [\n node?.sessions,\n node?.activeSessions,\n node?.active_sessions,\n node?.lastProbe?.sessions,\n node?.last_probe?.sessions,\n node?.lastProbe?.status?.sessions,\n node?.last_probe?.status?.sessions,\n ];\n for (const arr of sessionArrays) {\n if (Array.isArray(arr) && arr.some(isLocal)) return true;\n }\n\n const sessionRecords = [\n node?.activeSession,\n node?.active_session,\n node?.currentSession,\n node?.current_session,\n node?.runtimeSession,\n node?.runtime_session,\n node?.session,\n node?.lastProbe?.activeSession,\n node?.last_probe?.active_session,\n node?.lastProbe?.currentSession,\n node?.last_probe?.current_session,\n node?.lastProbe?.session,\n node?.last_probe?.session,\n ];\n for (const session of sessionRecords) {\n if (isLocal(session)) return true;\n }\n \n return false;\n}\n\nfunction isDirectLocalNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n const machineId = readNodeMachineId(node);\n const daemonId = readNodeDaemonId(node);\n // id-form robust: a node's daemon/machine id may be stored in a DIFFERENT form\n // (bare `mach_X` vs `daemon_mach_X` vs `standalone_mach_X`) than the coordinator's\n // resolved ctx ids. A strict `===` misclassified the coordinator's own node as\n // REMOTE, so the enqueue fan-out dispatched the task body to this very daemon — where\n // it fuzzy-injected into the coordinator's own CLI session (TASKECHO). daemonIdsEquivalent\n // canonicalizes both sides to the machine core before comparing.\n return Boolean(\n (ctx.localMachineId && daemonIdsEquivalent(machineId, ctx.localMachineId))\n || (ctx.localDaemonId && daemonIdsEquivalent(daemonId, ctx.localDaemonId))\n || nodeHasLocalDaemonEvidence(ctx, node)\n );\n}\n\nfunction isConfiguredCoordinatorNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n if (!ctx.localMachineId && !ctx.localDaemonId) return false;\n const nodeId = readString(node.id) || readString((node as any).nodeId) || readString((node as any).node_id);\n if (!nodeId) return false;\n // If the node carries explicit daemon/machine identity that doesn't match the\n // coordinator, it is definitively a remote node — skip the positional fallback.\n // Compare under canonical id form (daemonIdsEquivalent), NOT a raw `!==`: a local\n // coordinator node stored in a different daemon-id form (bare vs `daemon_`/`standalone_`)\n // would otherwise be wrongly excluded here and treated as remote.\n const nodeDaemonId = readNodeDaemonId(node);\n const nodeMachineId = readNodeMachineId(node);\n if (nodeDaemonId && ctx.localDaemonId && !daemonIdsEquivalent(nodeDaemonId, ctx.localDaemonId)) return false;\n if (nodeMachineId && ctx.localMachineId && !daemonIdsEquivalent(nodeMachineId, ctx.localMachineId)) return false;\n const preferredNodeId = readString(ctx.mesh.coordinator?.preferredNodeId)\n || readString((ctx.mesh.coordinator as any)?.preferred_node_id);\n if (preferredNodeId) return nodeId === preferredNodeId;\n const first = ctx.mesh.nodes?.[0] as any;\n const firstNodeId = readString(first?.id) || readString(first?.nodeId) || readString(first?.node_id);\n return !!firstNodeId && nodeId === firstNodeId;\n}\n\nfunction getLocalControlPlaneMatchReason(ctx: MeshContext, node: LocalMeshNodeEntry): string | undefined {\n if (isDirectLocalNode(ctx, node)) return 'matched coordinator daemon or machine id';\n if (isConfiguredCoordinatorNode(ctx, node)) return 'matched configured coordinator node';\n if (node.isLocalWorktree === true) {\n const sourceNode = findClonedFromNode(ctx, node);\n if (sourceNode && isDirectLocalNode(ctx, sourceNode)) return 'matched local cloned-from node';\n if (sourceNode && isConfiguredCoordinatorNode(ctx, sourceNode)) return 'matched configured coordinator source node';\n }\n return undefined;\n}\n\nfunction findClonedFromNode(ctx: MeshContext, node: LocalMeshNodeEntry): LocalMeshNodeEntry | undefined {\n const clonedFromNodeId = readString(node.clonedFromNodeId) || readString((node as any).cloned_from_node_id);\n if (!clonedFromNodeId) return undefined;\n return ctx.mesh.nodes.find(n => meshNodeIdMatches(n, clonedFromNodeId));\n}\n\n/**\n * Resolve the node id a `prefer_worktree` enqueue should target.\n *\n * Worktree clones (mesh_clone_node) are appended to `ctx.mesh.nodes`, so the\n * LAST worktree node in array order is the most recently created one — the one\n * the coordinator most likely just spun up for isolated work. Without an\n * explicit target, an unconstrained queue task is claimed by whichever node\n * polls first (typically the base/main workspace), defeating the isolation\n * intent. Returning a concrete node id lets enqueueTask stamp targetNodeId so\n * the existing node-targeted claim tier routes the task to the worktree.\n *\n * Returns undefined when no worktree node exists (the caller treats this as a\n * no-op and falls back to normal unconstrained queueing).\n */\nexport function resolvePreferredWorktreeNodeId(ctx: MeshContext): string | undefined {\n const worktreeNodes = (ctx.mesh.nodes || []).filter(n => (n as any).isLocalWorktree === true);\n if (worktreeNodes.length === 0) return undefined;\n const chosen = worktreeNodes[worktreeNodes.length - 1] as any;\n return readString(chosen?.id) || readString(chosen?.nodeId) || readString(chosen?.node_id);\n}\n\nexport function isLocalControlPlaneNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n return !!getLocalControlPlaneMatchReason(ctx, node);\n}\n","/**\n * MCP tool schema definitions for the mesh_* tool family.\n *\n * Pure data: per-tool input schemas plus the ALL_MESH_TOOLS registry. Physically\n * split out of mesh-tools.ts (which keeps the handler implementations) — see\n * RF-SURVEY candidate C1. No behavior change: mesh-tools.ts re-exports every symbol\n * below so existing `./tools/mesh-tools.js` import paths stay intact.\n */\n\nexport const MESH_STATUS_TOOL = {\n name: 'mesh_status',\n description: 'Get the current status of all nodes in the repo mesh — health, git state, active sessions, recovery hints, and recommended next steps. Use this to decide which node to send work to or how to recover from failures. Also reports the running daemon build per daemonId under top-level daemonBuilds ({commit, commitShort, version}); when a live daemon was built from a commit BEHIND its workspace HEAD it adds staleDaemonBuilds[] + staleDaemonBuildWarning — meaning a just-merged refinery/mesh-tool fix is NOT yet live on that daemon (awaiting deploy/restart; a local dist rebuild does not update a cloud daemon). Do not repeatedly call this to wait for generating delegated work; wait for pendingCoordinatorEvents/completion events or an explicit user status request.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n _gemini_compat: { type: 'string', description: 'Dummy property for Gemini compatibility. Ignore this.' },\n includeStaleDirectWorkDetails: { type: 'boolean', description: 'Opt in to the full staleDirectWork array. Defaults false; normal status returns compact staleDirectWorkSummary only.' },\n includeSessions: { type: 'boolean', description: 'Opt in to per-node live session arrays. Default false: compact mode returns a per-node sessionSummary (counts) and de-duplicated full session lists under top-level daemonSessions keyed by daemonId (sessions are not repeated for every node that shares a daemon). Set true to also include the full session array on each node.' },\n compact: { type: 'boolean', description: 'Slim payload for LLM callers. Default true. Folds per-node session arrays to sessionSummary and de-duplicates daemon-shared sessions into daemonSessions. Set false (or verbose=true) for the full dashboard-grade payload.' },\n verbose: { type: 'boolean', description: 'Force the full payload; overrides compact.' },\n },\n },\n};\n\nexport const MESH_LIST_NODES_TOOL = {\n name: 'mesh_list_nodes',\n description: 'List all nodes in the mesh with their capabilities, platform, and workspace paths.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n _gemini_compat: { type: 'string', description: 'Dummy property for Gemini compatibility. Ignore this.' },\n },\n },\n};\n\nexport const MESH_ENQUEUE_TASK_TOOL = {\n name: 'mesh_enqueue_task',\n description: 'Add a new task to the mesh work queue. Idle nodes will automatically pull and execute tasks from this queue. Use this instead of mesh_send_task when you do not need to target a specific node.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n message: { type: 'string', description: 'The task instruction for the agent.' },\n task_mode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'Optional task-mode contract. live_debug_readonly rejects obvious write/commit/push/deploy/destructive instructions before dispatch.' },\n taskMode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'CamelCase alias for task_mode.' },\n requiredTags: { type: 'array', items: { type: 'string' }, description: 'Optional capability tags that every eligible node must have, e.g. os=darwin, provider=codex-cli, gpu.' },\n required_tags: { type: 'array', items: { type: 'string' }, description: 'Snake_case alias for requiredTags.' },\n target_node_id: { type: 'string', description: 'Optional HARD constraint: ONLY this node may claim the task. No other node (especially a different machine) will ever claim it — if the target node has no idle session the task stays pending until it does. Use to route a queued task to a specific (e.g. freshly cloned) worktree node instead of letting the first idle base node claim it. Takes priority over prefer_worktree. An unresolvable target id is rejected at enqueue (no silent unpin).' },\n targetNodeId: { type: 'string', description: 'CamelCase alias for target_node_id.' },\n target_node: { type: 'string', description: 'Alias for target_node_id.' },\n targetNode: { type: 'string', description: 'CamelCase alias for target_node_id.' },\n prefer_worktree: { type: 'boolean', description: 'Optional: when true, route this task to the most recently cloned idle worktree node (avoids the main/base workspace preemptively claiming an isolated task). No-op if no worktree node exists; resolves to a target_node_id when one does.' },\n preferWorktree: { type: 'boolean', description: 'CamelCase alias for prefer_worktree.' },\n depends_on: { type: 'array', items: { type: 'string' }, description: 'Task ids that must complete before this task becomes claimable. Cycles are rejected at enqueue.' },\n dependsOn: { type: 'array', items: { type: 'string' }, description: 'CamelCase alias for depends_on.' },\n mission_id: { type: 'string', description: 'Mission this task belongs to (mesh_mission record id).' },\n missionId: { type: 'string', description: 'CamelCase alias for mission_id.' },\n },\n required: ['message'],\n },\n};\n\nexport const MESH_VIEW_QUEUE_TOOL = {\n name: 'mesh_view_queue',\n description: 'View the mesh work queue with source-of-truth active counts separated from historical completed/failed/cancelled records. Do not repeatedly call this to wait for generating assigned work; wait for pendingCoordinatorEvents/completion events or an explicit user status request.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n status: {\n type: 'array',\n items: { type: 'string' },\n description: 'Explicit row filter by task status: pending, assigned, completed, failed, cancelled. Source-of-truth counts remain unfiltered; visible* counts describe returned rows.',\n },\n view: {\n type: 'string',\n enum: ['all', 'active', 'historical'],\n description: 'Optional row view. active returns pending/assigned rows, historical returns completed/failed/cancelled rows, all returns every persisted queue row. Defaults to all for compatibility.',\n },\n compact: { type: 'boolean', description: 'Slim payload for LLM callers. Default true. Drops large historical (completed/failed/cancelled) queue row arrays, the full staleDirectWork orphan array (kept as staleDirectWorkSummary counts), and per-row maintenance cleanupCandidates in favor of counts; pending/assigned active rows are retained. Set false (or verbose=true) for the full dashboard-grade payload.' },\n verbose: { type: 'boolean', description: 'Force the full payload; overrides compact.' },\n },\n },\n};\n\nexport const MESH_QUEUE_CANCEL_TOOL = {\n name: 'mesh_queue_cancel',\n description: 'Cancel a pending/assigned/completed/failed mesh queue task without deleting audit history. Use this to retire stale queue items that target dead sessions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n task_id: { type: 'string', description: 'Queue task ID to cancel.' },\n reason: { type: 'string', description: 'Optional operator-visible reason for cancellation.' },\n },\n required: ['task_id'],\n },\n};\n\nexport const MESH_QUEUE_REQUEUE_TOOL = {\n name: 'mesh_queue_requeue',\n description: 'Return a mesh queue task to pending for retry. By default clears stale assigned owner and target session so another live session can claim it. When the task has exceeded its retry cap it is auto-failed instead; use force=true to override.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n task_id: { type: 'string', description: 'Queue task ID to requeue.' },\n reason: { type: 'string', description: 'Optional operator-visible reason for requeueing.' },\n target_node_id: { type: 'string', description: 'Optional replacement target node ID.' },\n target_session_id: { type: 'string', description: 'Optional replacement target runtime session ID.' },\n clear_target_node: { type: 'boolean', description: 'When true, remove any existing target node constraint.' },\n keep_target_session: { type: 'boolean', description: 'When true, preserve an existing target session if target_session_id is not provided. Defaults false to avoid stale session targets.' },\n force: { type: 'boolean', description: 'When true, bypass the retry cap and requeue even if maxRetries has been exceeded. Use only for explicit operator recovery.' },\n },\n required: ['task_id'],\n },\n};\n\nexport const MESH_SEND_TASK_TOOL = {\n name: 'mesh_send_task',\n description: 'Legacy push-based task assignment. Enqueues a task specifically targeted at a given node. The node will pull it immediately if idle.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID (from mesh_list_nodes).' },\n session_id: { type: 'string', description: 'Agent session ID on the target node.' },\n message: { type: 'string', description: 'Natural-language task to send to the agent.' },\n task_mode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'Optional task-mode contract. live_debug_readonly rejects obvious write/commit/push/deploy/destructive instructions before local or remote direct dispatch.' },\n taskMode: { type: 'string', enum: ['code_change', 'validation', 'live_debug_readonly', 'launch_app', 'convergence'], description: 'CamelCase alias for task_mode.' },\n mission_id: { type: 'string', description: 'Mission this task belongs to (mesh_mission record id). When set, the directly dispatched task is attributed to the mission task aggregates exactly like mesh_enqueue_task, including terminal completion. Omit for an unattributed direct dispatch.' },\n missionId: { type: 'string', description: 'CamelCase alias for mission_id.' },\n },\n required: ['node_id', 'session_id', 'message'],\n },\n};\n\nexport const MESH_READ_CHAT_TOOL = {\n name: 'mesh_read_chat',\n description: 'Read recent chat messages from a delegated agent session on a mesh node. Use compact=true for coordinator context-efficient review: it filters tool/internal/debug chatter and returns the final user-visible summary plus recent key messages. If the runtime session has completed, provider_session_id can explicitly target provider transcript history.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n session_id: { type: 'string', description: 'Agent session ID to read from.' },\n provider_session_id: { type: 'string', description: 'Optional provider transcript/session ID for completed sessions.' },\n tail: { type: 'number', description: 'Number of recent messages to return (default: 10).' },\n compact: { type: 'boolean', description: 'When true, return a compact coordinator summary instead of the full transcript: tool/internal/control/debug messages are excluded and only recent user-visible key messages plus the final assistant summary are included.' },\n },\n required: ['node_id', 'session_id'],\n },\n};\n\nexport const MESH_READ_DEBUG_TOOL = {\n name: 'mesh_read_debug',\n description: 'Collect a daemon-side chat/parser debug bundle for a delegated agent session on a mesh node without opening the browser UI. Defaults to daemon_file delivery and returns a saved bundle locator.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n session_id: { type: 'string', description: 'Agent session ID to debug.' },\n provider_session_id: { type: 'string', description: 'Optional provider transcript/session ID for completed session history.' },\n tail: { type: 'number', description: 'Number of recent read_chat messages to embed (default: 40).' },\n delivery: { type: 'string', enum: ['daemon_file', 'inline'], description: 'daemon_file saves the full sanitized bundle on the daemon; inline returns it directly. Default: daemon_file.' },\n },\n required: ['node_id', 'session_id'],\n },\n};\n\nexport const MESH_LAUNCH_SESSION_TOOL = {\n name: 'mesh_launch_session',\n description: 'Launch a new agent session on a mesh node. Returns the session ID for subsequent send_task/read_chat calls. If the user names a provider, preserve it exactly: Hermes = hermes-cli, Claude Code/Claude = claude-cli, Codex = codex-cli, Gemini = gemini-cli. If type is omitted, resolve strictly from the node policy providerPriority and provider detection; fail closed when no configured provider is usable. Do not default to claude-cli.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n type: { type: 'string', description: 'Optional provider type to launch. Use hermes-cli for Hermes, claude-cli for Claude Code, codex-cli for Codex, gemini-cli for Gemini. When omitted, node.policy.providerPriority is probed in order.' },\n force: { type: 'boolean', description: 'Set true to launch an ADDITIONAL session even when this node already has a live mesh-owned worker session. Default false: if a live worker session for this mesh+node already exists (e.g. an enqueue auto-launch just spawned one), the existing session is returned idempotently instead of creating an empty duplicate. Only pass force when you intentionally want a second concurrent provider/session on the node.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_GIT_STATUS_TOOL = {\n name: 'mesh_git_status',\n description: 'Get git status for a mesh node workspace — branch, dirty state, changed files.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_READ_NODE_LOGS_TOOL = {\n name: 'mesh_read_node_logs',\n description: 'Fetch a recent daemon LOG tail directly from a (possibly remote) mesh node over P2P — no session launch, no PowerShell/shell grep on the remote machine. '\n + 'Use this to debug a node\\'s daemon: read its error/warn lines, grep for a pattern, or read since a timestamp. '\n + 'The reply is byte-bounded (≤128KB, default 64KB; truncated:true when the file was larger, newest lines kept) and secrets (API keys, machine secrets, bearer tokens, JWTs, TURN credentials) are redacted before transmission. '\n + 'This reads the DAEMON log, not an agent session transcript — for a session transcript use mesh_read_chat / mesh_read_debug.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID (the daemon owning it serves its own log).' },\n grep: { type: 'string', description: 'Optional regex (case-insensitive) — only matching log lines are returned. Invalid regex falls back to a literal substring match.' },\n since_ms: { type: 'number', description: 'Optional epoch-ms floor — only log lines at/after this time are returned (lines without a parseable timestamp are kept).' },\n tail_bytes: { type: 'number', description: 'Max bytes of log tail to read (default 65536, capped at 131072). Larger files are truncated to the newest tail_bytes.' },\n date: { type: 'string', description: 'Optional YYYY-MM-DD log date (defaults to today). Falls back to the size-rotation backup when the active file is absent.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_FAST_FORWARD_NODE_TOOL = {\n name: 'mesh_fast_forward_node',\n description: 'Safely dry-run or execute an obvious direct fast-forward for a mesh node without launching an agent session. '\n + 'mode=\"merge\" (default) absorbs upstream commits into the local branch via git merge --ff-only (ahead=0, behind>0). '\n + 'mode=\"push\" publishes local commits to origin via a strict ff-only push (HEAD must be a descendant of origin/<branch>). '\n + 'Defaults to dry-run; execution requires execute=true. Never force-pushes, rebases, resets, cleans, or checks out arbitrary revisions. '\n + 'When the merge path finds the branch ahead with nothing to merge, it returns code \"ahead_needs_push\" pointing at mode=\"push\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n mode: { type: 'string', enum: ['merge', 'push'], description: 'merge (default): git merge --ff-only to absorb upstream. push: strict ff-only push of local commits to origin/<branch>; refuses any non-fast-forward.' },\n branch: { type: 'string', description: 'Optional guard: require the node\\'s current branch to match this branch before planning/executing.' },\n execute: { type: 'boolean', description: 'When true, apply the fast-forward/push if all safety gates pass. Defaults false/dry-run.' },\n dry_run: { type: 'boolean', description: 'Preview only. Defaults true unless execute=true; dry_run=true overrides execute.' },\n update_submodules: { type: 'boolean', description: 'mode=\"merge\" only: when true, if the root fast-forward changes gitlinks, run only git submodule update --init --recursive and verify submodules clean.' },\n push_submodules: { type: 'boolean', description: 'mode=\"push\" only: also ff-only push submodule HEADs to their origin main. Gated by mesh policy allowAutoPublishSubmoduleMainCommits — skipped unless that policy is enabled. Defaults false (root push only).' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_RESTART_DAEMON_TOOL = {\n name: 'mesh_restart_daemon',\n description: 'Update a mesh node\\'s daemon to the latest published version on its release channel and restart it — the same path as the dashboard \"preview update\" button, exposed as a mesh command so a coordinator can roll a worker daemon onto a freshly deployed version without a manual restart round-trip. No agent session is launched. '\n + 'Idle-gated: a node whose daemon has an active session (generating / waiting_approval / starting) is refused with code \"blocking_sessions\" so an in-flight turn is never interrupted. '\n + 'If the node is already on the latest version it is a no-op (no restart), matching the dashboard button (returns alreadyLatest:true). '\n + 'Targets a single node — call other (idle) nodes first; restarting the coordinator\\'s OWN daemon is naturally refused while its calling turn is active. '\n + 'Passing channel switches the daemon\\'s release channel (and server URL) before restarting; omit it to keep the daemon on its configured channel.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID — the daemon that owns this node is updated and restarted.' },\n channel: { type: 'string', enum: ['stable', 'preview'], description: 'Optional release channel to update from. Defaults to the daemon\\'s configured updateChannel. Setting it also repoints the daemon\\'s server URL to that channel.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_CHECKPOINT_TOOL = {\n name: 'mesh_checkpoint',\n description: 'Create a git checkpoint (commit) on a mesh node workspace.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n message: { type: 'string', description: 'Checkpoint commit message.' },\n },\n required: ['node_id', 'message'],\n },\n};\n\nexport const MESH_MISSION_UPSERT_TOOL = {\n name: 'mesh_mission_upsert',\n description: 'Create or update a persistent mission record so the plan survives coordinator restarts. Create a mission before enqueueing a multi-task batch, attach tasks via mesh_enqueue_task mission_id, and update status to completed/abandoned when the outcome is decided. Progress is derived from task statuses — there is no separate progress field.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n mission_id: { type: 'string', description: 'Mission id to update. Omit to create a new mission.' },\n title: { type: 'string', description: 'Short mission title.' },\n goal: { type: 'string', description: 'Free-text mission goal/definition of done.' },\n status: { type: 'string', enum: ['active', 'paused', 'completed', 'abandoned'], description: 'Mission lifecycle status. Defaults to active on create.' },\n },\n required: ['title'],\n },\n};\n\nexport const MESH_MISSION_LIST_TOOL = {\n name: 'mesh_mission_list',\n description: 'List missions with their goal, status, and live task progress (total/pending/assigned/completed/failed). '\n + 'Unlike mesh_status (which surfaces live + recent missions), this returns every mission regardless of status by default, '\n + 'so paused/abandoned/completed missions are never hidden. Filter with `status` to scope (e.g. [\"paused\"] to find paused missions). '\n + 'Compact (default) elides the full goal to a capped preview; pass verbose=true for full goal text. Read-only.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n status: {\n type: 'array',\n items: { type: 'string', enum: ['active', 'paused', 'completed', 'abandoned'] },\n description: 'Optional status filter. Omit to return missions of every status.',\n },\n verbose: { type: 'boolean', description: 'Return full goal text instead of a capped preview. Defaults to false (compact).' },\n },\n },\n};\n\nexport const MESH_APPROVE_TOOL = {\n name: 'mesh_approve',\n description: 'Approve or reject a pending action on a delegated agent session.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n session_id: { type: 'string', description: 'Agent session ID with pending approval.' },\n action: { type: 'string', enum: ['approve', 'reject'], description: 'Action to take.' },\n },\n required: ['node_id', 'session_id', 'action'],\n },\n};\n\nexport const MESH_CLONE_NODE_TOOL = {\n name: 'mesh_clone_node',\n description: 'Create a new worktree-based node from an existing node for isolated parallel work. '\n + 'Creates a git worktree on a new branch so multiple tasks can run on separate branches simultaneously.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n source_node_id: { type: 'string', description: 'Node ID to clone from (from mesh_list_nodes).' },\n branch: { type: 'string', description: 'Branch name for the new worktree (e.g. \"feat/auth-refactor\").' },\n base_branch: { type: 'string', description: 'Starting point for the branch (default: current HEAD).' },\n },\n required: ['source_node_id', 'branch'],\n },\n};\n\nexport const MESH_REMOVE_NODE_TOOL = {\n name: 'mesh_remove_node',\n description: 'Remove a node from the mesh. If the node is a worktree, also cleans up the git worktree and directory. Session cleanup is controlled by mesh policy sessionCleanupOnNodeRemove unless session_cleanup_mode overrides it for this call. The coordinator\\'s own local base node (same machine, NOT a worktree) is protected — removing it breaks live mesh membership and is rejected unless force:true is passed.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID to remove.' },\n session_cleanup_mode: {\n type: 'string',\n enum: ['preserve', 'stop', 'delete_stopped', 'stop_and_delete'],\n description: 'Optional override for cleanup of delegated sessions attached to this node. preserve keeps history/processes; stop stops live runtimes only; delete_stopped removes completed transcripts only; stop_and_delete stops live runtimes and deletes records.',\n },\n force: { type: 'boolean', description: 'Override the coordinator-base-node guard. Only set true to intentionally tear down this mesh; the coordinator must then be re-registered/restarted. Worktree nodes never need force.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_CLEANUP_SESSIONS_TOOL = {\n name: 'mesh_cleanup_sessions',\n description: 'Manually clean up delegated session records for a mesh node without removing the node. Defaults should preserve reviewable history unless the caller chooses a mode explicitly.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID whose delegated sessions should be considered for cleanup.' },\n mode: {\n type: 'string',\n enum: ['preserve', 'stop', 'delete_stopped', 'stop_and_delete'],\n description: 'preserve = no-op; stop = release process occupancy by stopping live runtimes; delete_stopped = remove completed/stopped records while leaving live runtimes alone; stop_and_delete = stop live runtimes and delete records.',\n },\n session_ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional explicit session IDs to limit cleanup to. When omitted, sessions are matched by node/workspace metadata.',\n },\n dry_run: { type: 'boolean', description: 'Preview matched/stopped/deleted/skipped session IDs without mutating session-host state.' },\n },\n required: ['node_id', 'mode'],\n },\n};\n\nexport const MESH_TASK_HISTORY_TOOL = {\n name: 'mesh_task_history',\n description: 'Read the task ledger for this mesh — dispatched tasks, completions, failures, checkpoints, and node lifecycle events. Use to understand what has been done before deciding next steps, to detect repeated failures, and to inform recovery decisions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n tail: { type: 'number', description: 'Number of recent entries to return (default: 20; clamped to 40 in compact mode, 200 in verbose).' },\n kind: { type: 'string', description: 'Filter by entry kind: task_dispatched, task_completed, task_failed, task_stalled, session_launched, checkpoint_created, node_cloned, node_removed, direct_fast_forward.' },\n compact: { type: 'boolean', description: 'Slim payload for LLM callers. Default true. Truncates long payload strings (message/taskSummary ≤200, finalSummary ≤300) and elides any large nested evidence blob (>2KB serialized — e.g. validationSummary/result/patchEquivalence/submoduleReachability) to a {_elided,_kind,_bytes,_hint} placeholder; full evidence stays accessible via mesh_reconcile_ledger. Set false (or verbose=true) for full untruncated payloads.' },\n verbose: { type: 'boolean', description: 'Force the full untruncated payload; overrides compact.' },\n },\n },\n};\n\nexport const MESH_RECORD_NOTE_TOOL = {\n name: 'mesh_record_note',\n description: 'Record a durable operating note for this mesh — a runtime-accumulated lesson that future coordinators inherit. '\n + 'Unlike Claude-only memory/CLAUDE.md, this is provider-neutral: it persists in the mesh ledger and is injected into every coordinator\\'s system prompt at launch (codex, hermes, antigravity, claude alike). '\n + 'Use it when you learn something durable: a provider quirk, a pattern to avoid, or a recovery lesson. Keep each note to one concrete, reusable fact. Not for transient task status — use missions/checkpoints for that.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n text: { type: 'string', description: 'The note — one concrete, reusable operating fact/lesson. Phrase it so a future coordinator can act on it without this conversation\\'s context.' },\n category: {\n type: 'string',\n enum: ['provider_quirk', 'pattern_to_avoid', 'recovery_lesson'],\n description: 'Optional classification: provider_quirk (a provider/runtime behaves unexpectedly), pattern_to_avoid (an approach that caused problems), recovery_lesson (how a failure was recovered).',\n },\n },\n required: ['text'],\n },\n};\n\nexport const MESH_RECONCILE_LEDGER_TOOL = {\n name: 'mesh_reconcile_ledger',\n description: 'Reconcile daemon-local mesh ledgers by querying bounded ledger slices over P2P/DataChannel and importing missing entries into the coordinator local JSONL ledger. Cloud/D1 is not used as a ledger source of truth.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_ids: { type: 'array', items: { type: 'string' }, description: 'Optional node IDs to query. Defaults to all mesh nodes.' },\n limit: { type: 'number', description: 'Bounded slice size per node. Defaults to 100 and is clamped by daemon-core.' },\n after_id: { type: 'string', description: 'Optional cursor entry ID; remote slices return entries strictly after this ID when present.' },\n since: { type: 'string', description: 'Optional ISO timestamp lower bound for queried entries.' },\n import_entries: { type: 'boolean', description: 'When false, query and report evidence without importing remote entries. Defaults true.' },\n },\n },\n};\n\nexport const MESH_PRUNE_STALE_DIRECT_TOOL = {\n name: 'mesh_prune_stale_direct',\n description: 'Prune orphaned staleDirect dispatch records — direct task dispatches whose original node/session is no longer present in the live mesh. dry_run (default) reports exactly which records would be pruned without mutating anything; pass execute=true to delete them. Active/pending/assigned/generating work and fresh unacknowledged dispatch failures (node/session still live) are always preserved. The append-only mesh ledger audit history is left intact.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n execute: { type: 'boolean', description: 'When true, actually delete the orphaned records. Defaults false (dry run). Ignored when dry_run=true.' },\n dry_run: { type: 'boolean', description: 'Force a preview without mutation even if execute=true. Defaults to dry-run behavior when execute is not set.' },\n include_terminal: { type: 'boolean', description: 'Also prune terminal (completed/failed) direct dispatch store rows in addition to orphans. Defaults false.' },\n },\n },\n};\n\nexport const MESH_REFINE_NODE_TOOL = {\n name: 'mesh_refine_node',\n description: 'The Refinery: validate → merge → push → clean up a completed worktree node onto the base branch. '\n + 'Defaults to dry-run (plan only): returns the validation plan with mergeWillRun:false/cleanupWillRun:false and performs NO merge/push/cleanup. '\n + 'Pass execute=true to actually converge the node. execute=true is async: the immediate response includes async:true, status:\\'accepted\\', jobId, interactionId, target node, and startedAt; completion/failure evidence is delivered through pending mesh events and the mesh task ledger. '\n + 'dry_run=true overrides execute. Matches the mesh_refine_batch / mesh_fast_forward_node dry_run/execute contract.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID of the completed worktree node to refine and merge.' },\n execute: { type: 'boolean', description: 'When true, run validation/merge/push/cleanup for this node. Defaults false/dry-run.' },\n dry_run: { type: 'boolean', description: 'Preview the validation plan without merging. Defaults true unless execute=true; dry_run=true overrides execute.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_REFINE_BATCH_TOOL = {\n name: 'mesh_refine_batch',\n description: 'Batch Refinery: converge multiple sibling worktree nodes onto the base branch in one conflict-aware sequential pipeline. '\n + 'Orders nodes by change-area (non-submodule nodes first, submodule-touching nodes serialized last) so each merged sibling advances the base and the next node auto-rebases + re-checks patch-equivalence before its own merge. '\n + 'Each node runs the same validation/patch-equivalence/submodule-reachability/merge/cleanup gates as mesh_refine_node. '\n + 'Conflicting or blocked nodes are isolated as blocked_review while the rest of the batch proceeds. Defaults to dry-run (plan only); set execute=true to converge. Never force-pushes or resets. '\n + 'execute=true is async: the immediate response is async:true / status:\\'accepted\\' with the batch jobId and ordered target node list; per-node convergence runs in the background and the aggregate completion/failure (with per-node merged / blocked_review / not_mergeable results) is delivered as a terminal refine event via pending mesh events and the ledger — do not re-invoke while a batch is in flight. dry_run returns the plan synchronously.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional explicit node IDs to converge, in any order (the tool computes the safe merge order). When omitted, all local worktree nodes that need convergence are auto-collected.',\n },\n execute: { type: 'boolean', description: 'When true, run validation/rebase/merge for each node in order. Defaults false/dry-run.' },\n dry_run: { type: 'boolean', description: 'Preview the ordering + per-node validation plan without executing. Defaults true unless execute=true; dry_run=true overrides execute.' },\n },\n required: [],\n },\n};\n\nexport const MESH_REFINE_CONFIG_SCHEMA_TOOL = {\n name: 'mesh_refine_config_schema',\n description: 'Return the Repo Mesh Refinery config JSON schema and supported repo-local config locations. This is the validation source of truth; heuristic command detection is suggestions-only.',\n inputSchema: { type: 'object' as const, properties: {} },\n};\n\nexport const MESH_VALIDATE_REFINE_CONFIG_TOOL = {\n name: 'mesh_validate_refine_config',\n description: 'Validate the repo mesh/refine config for a node/workspace without running validation commands or merging.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace whose refine config should be loaded. Defaults to the first mesh node.' },\n config: { type: 'object', description: 'Optional inline config object to validate instead of loading from the repo.' },\n },\n },\n};\n\nexport const MESH_SUGGEST_REFINE_CONFIG_TOOL = {\n name: 'mesh_suggest_refine_config',\n description: 'Suggest a repo mesh/refine config scaffold from project context/package scripts. Suggestions are never executed until saved as explicit refine config.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace used for suggestions. Defaults to the first mesh node.' },\n },\n },\n};\n\nexport const MESH_CHANGE_IMPACT_CONFIG_SCHEMA_TOOL = {\n name: 'mesh_change_impact_config_schema',\n description: 'Return the Change Impact config JSON schema and supported repo-local config locations. Change Impact config declaratively classifies which package/file changes between the live daemon build and workspace HEAD require a daemon rebuild/restart vs. a web-only redeploy vs. nothing. Declarative only — config is parsed, never executed.',\n inputSchema: { type: 'object' as const, properties: {} },\n};\n\nexport const MESH_VALIDATE_CHANGE_IMPACT_CONFIG_TOOL = {\n name: 'mesh_validate_change_impact_config',\n description: 'Validate a Change Impact config for a node/workspace and report valid/errors. Loads .adhdev/change-impact.{json,yaml,yml} (or repo-mesh-change-impact.* alias) from the repo unless an inline config is provided.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace whose change-impact config should be loaded. Defaults to the first mesh node.' },\n config: { type: 'object', description: 'Optional inline config object to validate instead of loading from the repo.' },\n },\n },\n};\n\nexport const MESH_SUGGEST_CHANGE_IMPACT_CONFIG_TOOL = {\n name: 'mesh_suggest_change_impact_config',\n description: 'Suggest a Change Impact config scaffold from the repo package layout (web-* → web-only, others → daemon-runtime, plus docs/license markers as non-runtime). Heuristic scaffold only — the draft must be reviewed and saved before it takes effect; nothing is executed.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace used for suggestions. Defaults to the first mesh node.' },\n },\n },\n};\n\nexport const MESH_INIT_TOOL = {\n name: 'mesh_init',\n description: 'One-click mesh onboarding for an existing git project. Detects installed CLI providers, suggests Refinery (.adhdev/refine.json) and worktree bootstrap (.adhdev/worktree_bootstrap.json) configs, optionally writes them to disk, and recommends a node providerPriority from the detected providers. Suggestions are scaffold only and never execute until saved; providerPriority is a recommendation to apply to node policy, not auto-applied. Defaults to dry-run (no files written) and never overwrites an existing config unless overwrite=true.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Optional node/workspace to onboard. Defaults to the first mesh node with a workspace.' },\n write: { type: 'boolean', description: 'When true, persist the suggested configs to disk. Defaults false (dry-run preview only).' },\n overwrite: { type: 'boolean', description: 'When true, overwrite an existing config file. Defaults false (never clobber an existing refine/bootstrap config).' },\n },\n },\n};\n\nexport const MESH_REFINE_PLAN_TOOL = {\n name: 'mesh_refine_plan',\n description: 'Dry-run Refinery plan for a worktree node: reports config source, validation commands, suggestions/unavailable reason, and merge/cleanup intent without executing validation or git merge.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Node ID of the worktree node to plan.' },\n },\n required: ['node_id'],\n },\n};\n\nexport const MESH_REVIEW_INBOX_TOOL = {\n name: 'mesh_review_inbox',\n description: 'List local worktree nodes that need human review: merge candidates (pushed feature branches ready to merge) and Refinery-blocked review results. Returns evidence summaries, diff stats vs. the default branch, and suggested actions (Refine / Requeue / Dismiss). Remote nodes are excluded in M4.0.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n mesh_id: { type: 'string', description: 'Mesh ID (optional — inferred from active mesh if omitted).' },\n },\n required: [],\n },\n};\n\nexport const ALL_MESH_TOOLS = [\n MESH_STATUS_TOOL,\n MESH_LIST_NODES_TOOL,\n MESH_ENQUEUE_TASK_TOOL,\n MESH_VIEW_QUEUE_TOOL,\n MESH_QUEUE_CANCEL_TOOL,\n MESH_QUEUE_REQUEUE_TOOL,\n MESH_SEND_TASK_TOOL,\n MESH_READ_CHAT_TOOL,\n MESH_READ_DEBUG_TOOL,\n MESH_LAUNCH_SESSION_TOOL,\n MESH_GIT_STATUS_TOOL,\n MESH_READ_NODE_LOGS_TOOL,\n MESH_FAST_FORWARD_NODE_TOOL,\n MESH_RESTART_DAEMON_TOOL,\n MESH_CHECKPOINT_TOOL,\n MESH_APPROVE_TOOL,\n MESH_CLONE_NODE_TOOL,\n MESH_REMOVE_NODE_TOOL,\n MESH_REFINE_NODE_TOOL,\n MESH_REFINE_BATCH_TOOL,\n MESH_REFINE_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_REFINE_CONFIG_TOOL,\n MESH_SUGGEST_REFINE_CONFIG_TOOL,\n MESH_CHANGE_IMPACT_CONFIG_SCHEMA_TOOL,\n MESH_VALIDATE_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_SUGGEST_CHANGE_IMPACT_CONFIG_TOOL,\n MESH_INIT_TOOL,\n MESH_REFINE_PLAN_TOOL,\n MESH_CLEANUP_SESSIONS_TOOL,\n MESH_PRUNE_STALE_DIRECT_TOOL,\n MESH_TASK_HISTORY_TOOL,\n MESH_RECORD_NOTE_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n MESH_MISSION_UPSERT_TOOL,\n MESH_MISSION_LIST_TOOL,\n MESH_REVIEW_INBOX_TOOL,\n];\n","/**\n * mesh_status compact-mode per-node fold helpers.\n *\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change. Slims the LLM-facing node copy: compact git snapshot, the canonical\n * preserved-marker list, the full per-node compaction (compactMeshStatusNode), the\n * quiet-node minimal stub (minimalCompactNode), node severity / noteworthiness\n * ranking, and the per-node session summary. Imports only the shared large-value\n * elider; the mesh_status node-array byte-budget bounding stays in mesh-tools.ts and\n * imports these back, so there is no runtime import cycle.\n */\nimport { elideLargeNestedValue } from './mesh-tool-shared.js';\n\n// Compact-mode git snapshot for LLM callers: keep the coordinator-relevant scalar\n// signals (branch/upstream/ahead/behind/dirty/headCommit) and the submodules array\n// (its out-of-sync state drives convergence decisions) while dropping the large\n// duplicated blobs (full changed-file lists, diffs, raw porcelain) that the full\n// dashboard payload carries. The full status object remains available via verbose.\nfunction buildCompactGitSnapshot(status: any): Record<string, unknown> | undefined {\n if (!status || typeof status !== 'object' || Array.isArray(status)) return undefined;\n const slim: Record<string, unknown> = {};\n const carry = [\n 'isGitRepo',\n 'branch',\n 'headCommit',\n 'upstream',\n 'upstreamStatus',\n 'ahead',\n 'behind',\n 'dirty',\n 'detached',\n 'submodules',\n ];\n for (const key of carry) {\n if (status[key] !== undefined) slim[key] = status[key];\n }\n return slim;\n}\n\n// Compact-mode submodules fold: the full submodules array (path/commit/status/\n// branch per submodule) is repeated on every node that shares a superproject, so\n// it grows O(nodes × submodules). In compact mode we keep the actionable signal\n// (count + the out-of-sync paths, which drive convergence decisions) and drop the\n// per-submodule commit/status blobs. The full array stays in verbose. Out-of-sync\n// paths are also surfaced separately on the node as `outOfSyncSubmodules`.\nfunction summarizeCompactSubmodules(submodules: any): Record<string, unknown> | undefined {\n if (!Array.isArray(submodules) || submodules.length === 0) return undefined;\n const outOfSync = submodules.filter((s: any) => s?.outOfSync).map((s: any) => s?.path).filter(Boolean);\n return {\n count: submodules.length,\n ...(outOfSync.length > 0 ? { outOfSyncPaths: outOfSync } : {}),\n };\n}\n\n// Canonical set of small per-node MARKER fields that MUST survive compact folding\n// intact on every node — quiet stub or detailed. Both fold paths reference this one\n// list: (a) the generic elide backstop skips these so they aren't truncated, and\n// (b) the minimal-stub reconstruction (minimalCompactNode) re-attaches them. Keeping\n// it single-sourced is the fix for the class of bug the rc.371 dataFreshness\n// regression exposed — a canonical node marker that survived the elide skip-list but\n// was silently dropped by the allowlist-based minimal stub, so it read null on\n// exactly the quiet nodes a coordinator most needs the marker for. Add a new marker\n// field HERE once and both fold paths preserve it; never hand-list it in two places.\nconst MESH_COMPACT_PRESERVED_MARKER_FIELDS = ['dataFreshness'] as const;\n\n// Compact-mode per-node fold for mesh_status. The dashboard/verbose payload\n// (`results`) is untouched; this only slims the LLM-facing node copy. It folds\n// the repetitive heavy fields that scale O(nodes):\n// - git: slim scalar snapshot + summarized submodules (no full file lists/blobs)\n// - machine: drop the verbose identityEvidence[] array and the long\n// localityReason string (which interpolates every evidence token) — keep the\n// resolved scalars (displayName/daemonId/machineId/hostname/sameMachine/locality)\n// - staleDaemonBuild: the full ~300-char warning + duplicated build fields are\n// already aggregated ONCE at the top level under staleDaemonBuilds[] +\n// staleDaemonBuildWarning. On the node, collapse to a short boolean-ish flag so\n// the per-node copy isn't N× the same warning text.\n// - branchConvergence: keep the decision fields (status/needsConvergence/reason/\n// branch/ahead/behind); drop the long per-node nextStep prose (it is echoed in\n// nextStepHints and branchConvergenceSummary).\n// Any remaining oversized nested blob is elided by the generic byte guard.\nexport function compactMeshStatusNode(entry: any): any {\n if (!entry || typeof entry !== 'object') return entry;\n const next: any = { ...entry };\n\n if (next.git !== undefined) {\n const slimGit = buildCompactGitSnapshot(next.git);\n if (slimGit) {\n if (slimGit.submodules !== undefined) {\n const subSummary = summarizeCompactSubmodules(slimGit.submodules);\n if (subSummary) slimGit.submodules = subSummary;\n else delete slimGit.submodules;\n }\n next.git = slimGit;\n }\n }\n\n if (next.machine && typeof next.machine === 'object') {\n const m = next.machine as Record<string, unknown>;\n next.machine = {\n daemonId: m.daemonId,\n machineId: m.machineId,\n hostname: m.hostname,\n displayName: m.displayName,\n sameMachine: m.sameMachine,\n locality: m.locality,\n };\n }\n\n // submoduleWarning is a fixed ~120-char prose string repeated on every node\n // with an out-of-sync submodule. The actionable signal (which submodules) is\n // already on `outOfSyncSubmodules`; collapse the prose to a boolean flag in\n // compact mode.\n if (typeof next.submoduleWarning === 'string') {\n next.submodulesOutOfSync = true;\n delete next.submoduleWarning;\n }\n\n if (next.staleDaemonBuild && typeof next.staleDaemonBuild === 'object') {\n const b = next.staleDaemonBuild as Record<string, unknown>;\n // Replace the full per-node object (warning prose + build fields, all of\n // which are aggregated top-level) with a terse flag. The daemonId lets the\n // coordinator cross-reference the top-level staleDaemonBuilds[] entry.\n next.staleDaemonBuild = {\n scope: b.scope,\n isDaemonAffecting: b.isDaemonAffecting !== false,\n seeStaleDaemonBuilds: true,\n };\n }\n\n // branchConvergence is kept intact for detailed compact nodes (it carries the\n // actionable per-node nextStep). It is small per-node and bounded by the\n // detail byte-budget; the larger repetition lives in branchConvergenceSummary,\n // which is capped separately. Quiet nodes drop nextStep via minimalCompactNode.\n\n // capabilityTagsByProvider repeats the os=/arch=/converge= base set once per\n // provider — heavy and O(nodes × providers). The representative capabilityTags\n // (kept) already conveys what a node can match; the per-provider breakdown is a\n // verbose/dashboard concern. Drop it from the compact LLM-facing copy.\n delete next.capabilityTagsByProvider;\n\n // Generic backstop: elide any other oversized nested blob on the node. The\n // structural blobs slimmed above plus the canonical preserved markers are skipped\n // so the byte guard never truncates them.\n const elideSkip = new Set<string>(['git', 'machine', 'branchConvergence', 'staleDaemonBuild', 'sessions', ...MESH_COMPACT_PRESERVED_MARKER_FIELDS]);\n for (const k of Object.keys(next)) {\n if (elideSkip.has(k)) continue;\n next[k] = elideLargeNestedValue(k, next[k]);\n }\n\n return next;\n}\n\n// Rough severity ranking so that when the byte budget forces a downgrade, the most\n// urgent nodes (errors/degraded/blocked launches) are the ones kept in detail.\nexport function compactNodeSeverity(entry: any): number {\n if (!entry || typeof entry !== 'object') return 0;\n if (entry.error || (entry.health && entry.health !== 'online' && entry.health !== 'dirty')) return 5;\n if (entry.launchReady === false) return 4;\n if (entry.isDirty === true || entry.health === 'dirty') return 3;\n if (entry.branchConvergence?.needsConvergence === true) return 2;\n if (entry.staleDaemonBuild || entry.submodulesOutOfSync || entry.recoveryHints) return 1;\n return 0;\n}\n\nexport function isNoteworthyCompactNode(entry: any): boolean {\n if (!entry || typeof entry !== 'object') return true;\n if (entry.health && entry.health !== 'online') return true;\n if (entry.isDirty === true) return true;\n if (entry.error) return true;\n if (entry.launchReady === false) return true;\n if (entry.staleDaemonBuild) return true;\n if (entry.submoduleWarning || entry.submodulesOutOfSync) return true;\n if (entry.recoveryHints) return true;\n if (Array.isArray(entry.nextStepHints) && entry.nextStepHints.length > 0) return true;\n if (entry.branchConvergence?.needsConvergence === true) return true;\n const sessionCount = Array.isArray(entry.sessions)\n ? entry.sessions.length\n : (entry.sessionSummary?.total ?? 0);\n if (sessionCount > 0) return true;\n return false;\n}\n\n// Minimal per-node stub for quiet nodes / byte-budget overflow. Keeps the fields a\n// coordinator needs to find and reason about a node (id/workspace/health/branch/\n// launchReady) plus the branchConvergence decision scalars, marked `folded` so\n// callers know the full compact detail is available via verbose.\nexport function minimalCompactNode(entry: any): any {\n if (!entry || typeof entry !== 'object') return entry;\n const bc = entry.branchConvergence && typeof entry.branchConvergence === 'object'\n ? {\n status: entry.branchConvergence.status,\n needsConvergence: entry.branchConvergence.needsConvergence,\n reason: entry.branchConvergence.reason,\n branch: entry.branchConvergence.branch,\n }\n : undefined;\n // Canonical per-node marker fields (e.g. dataFreshness) are exactly the signal a\n // coordinator needs on a QUIET node — is this idle peer live, cached, or\n // unreachable? — and they are tiny, so re-attach them from the single canonical\n // list rather than hand-listing each one (the path the dataFreshness regression\n // slipped through when only one field was added by hand).\n const preservedMarkers: Record<string, unknown> = {};\n for (const field of MESH_COMPACT_PRESERVED_MARKER_FIELDS) {\n if (entry[field] !== undefined) preservedMarkers[field] = entry[field];\n }\n return {\n nodeId: entry.nodeId,\n workspace: entry.workspace,\n daemonId: entry.daemonId,\n health: entry.health,\n branch: entry.branch,\n launchReady: entry.launchReady,\n ...(entry.providerPriority !== undefined ? { providerPriority: entry.providerPriority } : {}),\n // Keep the routable tag set on quiet/folded nodes — a coordinator planning\n // required_tags routing needs it even for nodes with nothing to converge.\n ...(entry.capabilityTags !== undefined ? { capabilityTags: entry.capabilityTags } : {}),\n ...(entry.launchBlockedReason !== undefined ? { launchBlockedReason: entry.launchBlockedReason } : {}),\n ...(bc ? { branchConvergence: bc } : {}),\n ...(entry.sessionSummary ? { sessionSummary: entry.sessionSummary } : {}),\n ...preservedMarkers,\n folded: true,\n };\n}\n\n// Fold a node's slim session list into status/provider counts. Compact mode\n// returns this instead of the full per-session array so the payload does not\n// grow O(nodes × sessions). The self-coordinator marker is preserved as a\n// dedicated count + id list so the coordinator never mis-reads its own\n// generating CLI session as a foreign delegated task.\nexport function summarizeNodeSessions(sessions: any[]): Record<string, unknown> {\n const list = Array.isArray(sessions) ? sessions : [];\n const byStatus: Record<string, number> = {};\n const providerCounts: Record<string, number> = {};\n const selfCoordinatorSessionIds: string[] = [];\n for (const s of list) {\n const status = typeof s?.status === 'string' && s.status ? s.status : 'unknown';\n byStatus[status] = (byStatus[status] ?? 0) + 1;\n const provider = typeof s?.providerType === 'string' && s.providerType ? s.providerType : 'unknown';\n providerCounts[provider] = (providerCounts[provider] ?? 0) + 1;\n if (s?.isSelfCoordinator === true && s.id) selfCoordinatorSessionIds.push(String(s.id));\n }\n const summary: Record<string, unknown> = {\n total: list.length,\n byStatus,\n providerCounts,\n };\n if (selfCoordinatorSessionIds.length > 0) {\n summary.selfCoordinatorSessionIds = selfCoordinatorSessionIds;\n }\n return summary;\n}\n","/**\n * Work-queue view / maintenance / compaction helpers for the mesh_* tools.\n *\n * Physically split out of mesh-tools.ts (RF-SURVEY candidate C1) with no behavior\n * change. Holds queue status/view normalization, the liveness index + stale-\n * assignment detection, maintenance reporting, and the compact row/active-work\n * folders. Imports only leaf deps (mesh-tool-shared, mesh-session-helpers) plus the\n * LocalMeshEntry type; mesh-tools.ts imports the exported helpers/constants back, so\n * there is no runtime import cycle.\n */\nimport type { LocalMeshEntry } from '@adhdev/daemon-core';\nimport { readString, elideLargeNestedValue } from './mesh-tool-shared.js';\nimport { collectNodeSessionIds } from './mesh-session-helpers.js';\n\nconst STALE_ASSIGNED_QUEUE_MS = 30 * 60_000;\nconst OLD_HISTORICAL_QUEUE_RECORD_MS = 7 * 24 * 60 * 60_000;\nexport const ACTIVE_QUEUE_STATUSES = new Set(['pending', 'assigned']);\nexport const HISTORICAL_QUEUE_STATUSES = new Set(['completed', 'failed', 'cancelled']);\nexport type QueueViewMode = 'all' | 'active' | 'historical';\n\ntype QueueLivenessIndex = {\n nodeIds: Set<string>;\n nodeSessionIds: Map<string, Set<string>>;\n};\n\nfunction buildQueueLivenessIndex(mesh?: LocalMeshEntry): QueueLivenessIndex {\n const nodeIds = new Set<string>();\n const nodeSessionIds = new Map<string, Set<string>>();\n for (const node of Array.isArray(mesh?.nodes) ? mesh.nodes : []) {\n const nodeId = readString((node as any).id) || readString((node as any).nodeId) || readString((node as any).node_id);\n if (!nodeId) continue;\n nodeIds.add(nodeId);\n const sessions = collectNodeSessionIds(node);\n if (sessions.size > 0) nodeSessionIds.set(nodeId, sessions);\n }\n return { nodeIds, nodeSessionIds };\n}\n\nfunction queueAssignmentStaleReason(task: any, liveness: QueueLivenessIndex): string | undefined {\n if (task?.status !== 'assigned') return undefined;\n const nodeId = readString(task.assignedNodeId) || readString(task.nodeId) || readString(task.node_id) || readString(task.targetNodeId);\n const sessionId = readString(task.assignedSessionId) || readString(task.sessionId) || readString(task.session_id) || readString(task.targetSessionId);\n\n if (nodeId && liveness.nodeIds.size > 0 && !liveness.nodeIds.has(nodeId)) {\n return 'assigned node is not present in the current mesh snapshot';\n }\n if (nodeId && sessionId && liveness.nodeSessionIds.has(nodeId) && !liveness.nodeSessionIds.get(nodeId)!.has(sessionId)) {\n return 'assigned session is not live on the assigned node';\n }\n\n const updatedAt = new Date(task.updatedAt).getTime();\n const ageMs = Number.isFinite(updatedAt) ? Date.now() - updatedAt : null;\n if (!nodeId && ageMs !== null && ageMs >= STALE_ASSIGNED_QUEUE_MS) {\n return 'assigned task has no assigned node metadata';\n }\n return undefined;\n}\n\nexport function buildQueueStatusSummary(queue: any[]): Record<string, unknown> {\n const counts = { pending: 0, assigned: 0, completed: 0, failed: 0, cancelled: 0 };\n let staleAssigned = 0;\n for (const task of queue) {\n const status = typeof task?.status === 'string' ? task.status : undefined;\n if (status && Object.prototype.hasOwnProperty.call(counts, status)) {\n counts[status as keyof typeof counts] += 1;\n }\n if (status === 'assigned' && task?.staleAssigned === true) staleAssigned += 1;\n }\n const liveAssigned = Math.max(0, counts.assigned - staleAssigned);\n return {\n totalCount: queue.length,\n activeCount: counts.pending + liveAssigned,\n historicalCount: counts.completed + counts.failed + counts.cancelled,\n counts,\n activeCounts: {\n pending: counts.pending,\n assigned: liveAssigned,\n },\n staleAssignedCount: staleAssigned,\n rawActiveCounts: {\n pending: counts.pending,\n assigned: counts.assigned,\n },\n historicalCounts: {\n completed: counts.completed,\n failed: counts.failed,\n cancelled: counts.cancelled,\n },\n };\n}\n\nexport function normalizeQueueViewMode(value: unknown): QueueViewMode {\n return value === 'active' || value === 'historical' || value === 'all' ? value : 'all';\n}\n\nexport function sanitizeQueueStatusFilter(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const statuses = value\n .map(item => typeof item === 'string' ? item.trim() : '')\n .filter(status => ACTIVE_QUEUE_STATUSES.has(status) || HISTORICAL_QUEUE_STATUSES.has(status));\n return statuses.length ? Array.from(new Set(statuses)) : undefined;\n}\n\nexport function filterQueueForView(queue: any[], view: QueueViewMode, statuses?: string[]): any[] {\n if (statuses?.length) {\n const allowed = new Set(statuses);\n return queue.filter(task => allowed.has(String(task?.status || '')));\n }\n if (view === 'active') return queue.filter(task => ACTIVE_QUEUE_STATUSES.has(String(task?.status || '')));\n if (view === 'historical') return queue.filter(task => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n return queue;\n}\n\nexport function prioritizeActiveQueueRows(queue: any[]): any[] {\n const active: any[] = [];\n const historical: any[] = [];\n const other: any[] = [];\n for (const task of queue) {\n const status = String(task?.status || '');\n if (ACTIVE_QUEUE_STATUSES.has(status)) active.push(task);\n else if (HISTORICAL_QUEUE_STATUSES.has(status)) historical.push(task);\n else other.push(task);\n }\n return [...active, ...other, ...historical];\n}\n\nfunction slimQueueTask(task: any): Record<string, unknown> {\n return {\n id: task?.id,\n status: task?.status,\n assignedNodeId: task?.assignedNodeId,\n assignedSessionId: task?.assignedSessionId,\n targetNodeId: task?.targetNodeId,\n targetSessionId: task?.targetSessionId,\n updatedAt: task?.updatedAt,\n staleAssigned: task?.staleAssigned === true,\n staleReason: task?.staleReason,\n };\n}\n\nexport function buildQueueMaintenanceReport(queue: any[]): Record<string, unknown> {\n const now = Date.now();\n const staleAssignedTasks = queue\n .filter(task => task?.status === 'assigned' && task?.staleAssigned === true)\n .map(slimQueueTask);\n const historicalTasks = queue.filter(task => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n const oldHistoricalTasks = historicalTasks\n .filter(task => {\n const updatedAt = new Date(task?.updatedAt).getTime();\n return Number.isFinite(updatedAt) && now - updatedAt >= OLD_HISTORICAL_QUEUE_RECORD_MS;\n })\n .map(task => ({\n ...slimQueueTask(task),\n cleanupClass: 'old_historical_record',\n reason: 'terminal queue record is older than the read-only maintenance threshold',\n }));\n const cleanupCandidates = [\n ...staleAssignedTasks.map(task => ({\n ...task,\n cleanupClass: 'stale_assigned',\n reason: typeof task.staleReason === 'string' ? task.staleReason : 'active assigned task does not match current live mesh node/session state',\n suggestedOperation: 'operator_review_then_requeue_or_cancel',\n })),\n ...oldHistoricalTasks.map(task => ({\n ...task,\n suggestedOperation: 'operator_review_then_archive_or_keep',\n })),\n ];\n return {\n readOnly: true,\n mutationPerformed: false,\n sourceOfTruth: 'mesh_work_queue_file',\n staleAssignedDefinition: 'Only active assigned queue rows are stale candidates, and only when the assigned node/session is absent from the current live mesh snapshot.',\n historicalDefinition: 'completed/failed/cancelled rows are historical ledger records and never active assignments.',\n staleAssignedTasks,\n staleAssignedCount: staleAssignedTasks.length,\n historicalRecordCount: historicalTasks.length,\n oldHistoricalRecordCount: oldHistoricalTasks.length,\n cleanupCandidates,\n cleanupCandidateCount: cleanupCandidates.length,\n };\n}\n\n// Compact maintenance report: drop the per-row arrays (staleAssignedTasks,\n// cleanupCandidates) that scale with old historical record count and instead\n// surface the counts. staleAssignedTasks rows are still active work, so keep a\n// small sample for coordinator visibility; cleanupCandidates are dominated by\n// old historical rows and are dropped entirely in favor of the count + a hint.\nexport function buildCompactQueueMaintenanceReport(maintenance: Record<string, unknown>): Record<string, unknown> {\n const staleAssignedTasks = Array.isArray((maintenance as any).staleAssignedTasks)\n ? (maintenance as any).staleAssignedTasks\n : [];\n const cleanupCandidateCount = (maintenance as any).cleanupCandidateCount ?? 0;\n return {\n readOnly: true,\n mutationPerformed: false,\n sourceOfTruth: 'mesh_work_queue_file',\n payloadMode: 'compact',\n staleAssignedDefinition: (maintenance as any).staleAssignedDefinition,\n historicalDefinition: (maintenance as any).historicalDefinition,\n // staleAssignedTasks are active assigned rows (not historical) — retain a\n // bounded sample so coordinators can still see drift without the full array.\n staleAssignedTasks: staleAssignedTasks.slice(0, 5),\n staleAssignedSampleLimit: 5,\n staleAssignedCount: (maintenance as any).staleAssignedCount ?? staleAssignedTasks.length,\n historicalRecordCount: (maintenance as any).historicalRecordCount ?? 0,\n oldHistoricalRecordCount: (maintenance as any).oldHistoricalRecordCount ?? 0,\n cleanupCandidateCount,\n cleanupCandidatesOmitted: true,\n cleanupCandidatesHint: 'Per-row cleanup candidates are omitted in compact mode; call mesh_view_queue with verbose=true for the full maintenance/cleanupDryRun rows.',\n };\n}\n\n// Compact-mode bounds for mesh_view_queue active rows. Active (pending/assigned)\n// rows are kept — they drive dispatch decisions — but a busy mesh can have dozens\n// of them, each carrying the full task `message` (often multi-KB). Truncate the\n// message and cap the row count so the active queue can't blow the token cap.\nexport const COMPACT_MAX_ACTIVE_QUEUE_ROWS = 15;\nconst COMPACT_QUEUE_MESSAGE_CAP = 140;\nexport const COMPACT_MAX_ACTIVE_WORK_ROWS = 12;\n// In compact mode an activeWork row keeps a single short title only; the original\n// delegation prompt is NOT echoed (leak #2). 80 chars is enough to recognize the task.\nconst COMPACT_ACTIVE_WORK_TITLE_CAP = 80;\n\nfunction truncateForCompact(value: unknown, cap: number): unknown {\n if (typeof value !== 'string') return value;\n return value.length > cap ? value.slice(0, cap) + '…' : value;\n}\n\n// Slim an active queue row for compact mode: truncate the long free-text message\n// and elide any oversized nested field. Status/ids/deps/tags (the dispatch-relevant\n// scalars) are preserved.\nexport function compactQueueRow(task: any): any {\n if (!task || typeof task !== 'object') return task;\n const slim: any = {};\n for (const [k, v] of Object.entries(task)) {\n if (k === 'message') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else slim[k] = elideLargeNestedValue(k, v);\n }\n return slim;\n}\n\nexport function compactQueueRows(rows: any[]): { rows: any[]; omitted: number } {\n const capped = rows.slice(0, COMPACT_MAX_ACTIVE_QUEUE_ROWS).map(compactQueueRow);\n return { rows: capped, omitted: Math.max(0, rows.length - capped.length) };\n}\n\n// Slim an activeWork record for compact mode. Leak #2: the original delegation\n// prompt was echoed THREE times per row — `taskTitle` (truncated) + `taskSummary`\n// (mid-length) + `message` (full). In compact we keep only a single short\n// `taskTitle`; `taskSummary` and `message` are dropped entirely (the full text is\n// available via mesh_task_history or with verbose=true). All dispatch-relevant\n// scalars (taskId/status/nodeId/sessionId/timestamps/terminal+stale flags) are\n// preserved so the row stays actionable.\nfunction compactActiveWorkRecord(record: any): any {\n if (!record || typeof record !== 'object') return record;\n const slim: any = {};\n for (const [k, v] of Object.entries(record)) {\n if (k === 'message' || k === 'taskSummary') continue; // redundant full-text echoes\n else if (k === 'taskTitle') slim[k] = truncateForCompact(v, COMPACT_ACTIVE_WORK_TITLE_CAP);\n else slim[k] = elideLargeNestedValue(k, v);\n }\n return slim;\n}\n\nexport function compactActiveWorkRecords(records: any[]): { records: any[]; omitted: number } {\n if (!Array.isArray(records)) return { records, omitted: 0 };\n const capped = records.slice(0, COMPACT_MAX_ACTIVE_WORK_ROWS).map(compactActiveWorkRecord);\n return { records: capped, omitted: Math.max(0, records.length - capped.length) };\n}\n\nexport function annotateQueueStaleness(queue: any[], mesh?: LocalMeshEntry): any[] {\n const liveness = buildQueueLivenessIndex(mesh);\n const now = Date.now();\n return queue.map(task => {\n const taskStatus = typeof task?.status === 'string' ? task.status : undefined;\n const annotated = {\n ...task,\n taskStatus,\n isActive: taskStatus ? ACTIVE_QUEUE_STATUSES.has(taskStatus) : false,\n isHistorical: taskStatus ? HISTORICAL_QUEUE_STATUSES.has(taskStatus) : false,\n dispatchedAt: task?.createdAt,\n ...(taskStatus === 'assigned' ? { activeTaskId: task.id } : {}),\n ...(taskStatus === 'completed' || taskStatus === 'failed' ? {\n completedAt: task.updatedAt,\n } : {}),\n };\n if (taskStatus !== 'assigned') return annotated;\n const updatedAt = new Date(task.updatedAt).getTime();\n const ageMs = Number.isFinite(updatedAt) ? now - updatedAt : null;\n const staleReason = queueAssignmentStaleReason(task, liveness);\n if (!staleReason) return annotated;\n return {\n ...annotated,\n stale: true,\n staleAssigned: true,\n staleReason,\n ...(ageMs !== null ? { assignedAgeMs: ageMs } : {}),\n };\n });\n}\n","export const RAPID_READ_CHAT_ADVISORY_WINDOW_MS = 5_000;\n\nconst ACTIVE_READ_STATUSES = new Set([\n 'generating',\n 'running',\n 'streaming',\n 'starting',\n 'busy',\n]);\n\ntype RecentRead = {\n at: number;\n status?: string;\n};\n\nexport type RapidReadChatAdvisory = {\n type: 'rapid_read_chat_polling';\n toolName: string;\n windowMs: number;\n elapsedMs: number;\n nextSuggestedReadAt: number;\n completionCallbackExpected: boolean;\n message: string;\n};\n\nconst recentReads = new Map<string, RecentRead>();\n\nexport function clearRapidReadChatAdvisoryStateForTests(): void {\n recentReads.clear();\n}\n\nexport function isActiveReadChatStatus(status: unknown): boolean {\n return typeof status === 'string' && ACTIVE_READ_STATUSES.has(status.toLowerCase());\n}\n\nexport function annotateRapidReadChatAdvisory<T extends Record<string, any>>(\n payload: T,\n options: {\n key: string;\n now?: number;\n status?: unknown;\n toolName: 'read_chat' | 'mesh_read_chat' | string;\n completionCallbackExpected?: boolean;\n },\n): T & { pollingAdvisory?: RapidReadChatAdvisory } {\n const now = options.now ?? Date.now();\n const status = options.status ?? payload?.status ?? payload?.data?.status ?? payload?.result?.status;\n const active = isActiveReadChatStatus(status);\n const previous = recentReads.get(options.key);\n\n if (!active) {\n recentReads.set(options.key, { at: now, status: typeof status === 'string' ? status : undefined });\n return payload;\n }\n\n recentReads.set(options.key, { at: now, status: typeof status === 'string' ? status : undefined });\n\n if (!previous || !isActiveReadChatStatus(previous.status)) return payload;\n const elapsedMs = now - previous.at;\n if (elapsedMs < 0 || elapsedMs >= RAPID_READ_CHAT_ADVISORY_WINDOW_MS) return payload;\n\n return {\n ...payload,\n pollingAdvisory: {\n type: 'rapid_read_chat_polling',\n toolName: options.toolName,\n windowMs: RAPID_READ_CHAT_ADVISORY_WINDOW_MS,\n elapsedMs,\n nextSuggestedReadAt: previous.at + RAPID_READ_CHAT_ADVISORY_WINDOW_MS,\n completionCallbackExpected: Boolean(options.completionCallbackExpected),\n message: `This session is still ${String(status)}. Avoid repeated ${options.toolName} polling for the same generating session; wait for the completion callback/status event or retry after the suggested time if you are debugging a real stall.`,\n },\n };\n}\n","// Mesh tool implementations — status domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n COMPACT_DETAILED_NODES_BYTE_BUDGET,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n COMPACT_MISSIONS_BYTE_BUDGET,\n COMPACT_NODES_TOTAL_BYTE_BUDGET,\n assignFullGitSnapshot,\n buildActiveWorkPollingGuidance,\n buildBranchConvergence,\n buildCompactStaleDirectWorkSummary,\n buildCoordinatorP2pRelayFailure,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n buildMeshNodeProbeFreshness,\n buildMeshSchedulingRuntime,\n buildNodeCapabilityExposure,\n buildNodeMachineIdentity,\n collectLiveStatusProbe,\n collectRelatedRepoStatuses,\n commandForNode,\n compactActiveWorkRecords,\n compactMeshStatusNode,\n compactNodeSeverity,\n computeMeshMissionStats,\n countUncommittedChanges,\n drainCoordinatorPendingEvents,\n extractGitStatus,\n extractSubmodules,\n getActiveDirectDispatches,\n getLatestActiveLaunchFailure,\n getLedgerSummary,\n getMeshStatusMissionSummaries,\n getMeshStatusMissionsCompact,\n getNodeLaunchReadiness,\n getQueue,\n getSessionRecoveryContext,\n isGitStatusDirty,\n isNoteworthyCompactNode,\n minimalCompactNode,\n readLedgerEntries,\n readNodeDaemonId,\n readNodeMachineId,\n readRelatedRepos,\n reconcileDirectDispatchesFromTranscriptEvidence,\n recordMeshToolCall,\n refreshMeshFromDaemon,\n summarizeBranchConvergence,\n summarizeMeshAsyncRefineJobs,\n summarizeNodeSessions,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\n\n\n// ─── Tool Implementations ───────────────────────\n\nexport async function meshStatus(ctx: MeshContext, args: { includeStaleDirectWorkDetails?: boolean; includeTerminalDirectWork?: boolean; includeSessions?: boolean; compact?: boolean; verbose?: boolean } = {}): Promise<string> {\n const rateResult = recordMeshToolCall({ meshId: ctx.mesh.id, tool: 'mesh_status' });\n // Default to the slim payload for LLM callers; verbose forces the full payload.\n const compact = args.verbose === true ? false : (args.compact ?? true);\n\n await refreshMeshFromDaemon(ctx);\n const { mesh, transport } = ctx;\n\n let ledgerSummary = getLedgerSummary(mesh.id);\n\n // Scheduling-runtime projection (load-balancer's live view): tie-break strategy,\n // global parallel caps + consumption, and per-node load / priority / provider caps\n // with structured \"why this node can't take more write work\" reasons. Derived from\n // the mesh config + a queue snapshot (read-only) — never drives a scheduling\n // decision, only exposes the picture the claim path acts on. Computed once so each\n // node entry below can attach its slice and the response can carry the mesh rollup.\n const schedulingRuntime = buildMeshSchedulingRuntime(mesh, getQueue(mesh.id));\n const schedulingByNode = new Map(schedulingRuntime.nodes.map(n => [n.nodeId, n]));\n\n // Probe all nodes in parallel — git_status + session collection per node are independent.\n const results = await Promise.all(mesh.nodes.map(async (node) => {\n const entry: any = {\n nodeId: node.id,\n workspace: node.workspace,\n machine: buildNodeMachineIdentity(ctx, node),\n daemonId: readNodeDaemonId(node),\n machineId: readNodeMachineId(node),\n ...getNodeLaunchReadiness(node),\n ...buildNodeCapabilityExposure(node),\n };\n\n // Per-node scheduling runtime (load, priority, provider caps, claim-block reasons).\n // Full detail is a dashboard/verbose concern; in compact mode it repeats per node\n // and would inflate the LLM payload past its byte budget, so compact keeps only the\n // two scalars a coordinator needs to reason about load (current load + cap-reached).\n // The mesh-level scheduling rollup (strategy/global caps) is always present below.\n const nodeScheduling = schedulingByNode.get(node.id);\n if (nodeScheduling) {\n // Drop the redundant nodeId — the entry already carries it.\n const { nodeId: _omit, ...rest } = nodeScheduling;\n entry.scheduling = compact\n ? { load: rest.load, capReached: rest.capReached }\n : rest;\n }\n\n // Tracks whether THIS call obtained live truth from a fresh git_status probe.\n // The coordinator-facing mesh_status always probes each node fresh, so a probe\n // that returns is live truth and a probe that throws is an unreachable peer —\n // consumed below to stamp the additive `dataFreshness` marker.\n let liveTruthProbed = false;\n try {\n const autoDiscover = (node.policy as any)?.autoDiscoverSubmodules !== false;\n const statusResult = await commandForNode(ctx, node, 'git_status', {\n workspace: node.workspace,\n refreshUpstream: true,\n includeSubmodules: autoDiscover,\n submoduleIgnorePaths: (node.policy as any)?.submoduleIgnorePaths || undefined,\n });\n liveTruthProbed = true;\n const status = extractGitStatus(statusResult);\n const uncommittedChanges = countUncommittedChanges(status);\n const dirty = isGitStatusDirty(status);\n entry.health = status?.isGitRepo ? (dirty ? 'dirty' : 'online') : 'degraded';\n assignFullGitSnapshot(entry, status);\n entry.branch = status?.branch;\n entry.isDirty = dirty;\n entry.uncommittedChanges = uncommittedChanges;\n entry.branchConvergence = buildBranchConvergence(mesh, node, status, dirty, uncommittedChanges);\n // Stale-daemon-build warning: the live daemon's build commit is a\n // strict ancestor of this workspace HEAD (or its oss submodule),\n // meaning merged code is not yet live (awaiting deploy/restart).\n // Computed git-correctly on the daemon side (git_status →\n // daemonBuildBehind); surfaced here as a top-level node field.\n if (status?.daemonBuildBehind && typeof status.daemonBuildBehind === 'object') {\n entry.staleDaemonBuild = status.daemonBuildBehind;\n }\n // Submodule out-of-sync warning\n const submodules = extractSubmodules(statusResult, (node.policy as any)?.submoduleIgnorePaths || []);\n if (submodules && submodules.some((s: any) => s?.outOfSync)) {\n entry.submoduleWarning = 'One or more submodules are out of sync with the parent repo. Run `git submodule update` or check deployment readiness.';\n entry.outOfSyncSubmodules = submodules.filter((s: any) => s?.outOfSync).map((s: any) => s.path);\n }\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'git_status',\n targetDaemonId: node.daemonId,\n nodeId: node.id,\n });\n entry.health = 'degraded';\n entry.error = failure.error;\n entry.degradedReason = failure.recoverable ? 'p2p_relay_failure' : 'git_status_unavailable';\n Object.assign(entry, {\n code: failure.code,\n transport: failure.transport,\n recoverable: failure.recoverable,\n retryRecommended: failure.retryRecommended,\n nextAction: failure.nextAction,\n noFallbackReason: failure.noFallbackReason,\n });\n }\n\n // Additive freshness/reachability marker. Without this, the coordinator's\n // mesh_status could not tell a node whose live probe just succeeded from one\n // it could not reach — both rendered as `health` + git scalars only. Derived\n // through the SINGLE canonical daemon-core live-probe adapter\n // (buildMeshNodeProbeFreshness) rather than rebuilding the freshness input\n // here, so the dataSource/staleness wiring cannot drift between this\n // coordinator surface and the daemon aggregate (the rc.371 regression where\n // dataFreshness was wired on the daemon surface but null on every coordinator\n // node because this site re-derived its own input).\n entry.dataFreshness = buildMeshNodeProbeFreshness({\n git: entry.git,\n liveTruthProbed,\n isSelfNode: (entry.machine as any)?.sameMachine === true,\n daemonId: readNodeDaemonId(node),\n node,\n });\n\n // Recovery Hints & Next-step reporting\n const recoveryContext = getSessionRecoveryContext(mesh.id, { nodeId: node.id });\n if (recoveryContext.consecutiveNodeFailures > 0) {\n entry.recoveryHints = {\n consecutiveFailures: recoveryContext.consecutiveNodeFailures,\n lastTaskMessage: typeof recoveryContext.lastTaskMessage === 'string'\n ? recoveryContext.lastTaskMessage.slice(0, 100) + (recoveryContext.lastTaskMessage.length > 100 ? '…' : '')\n : recoveryContext.lastTaskMessage,\n advice: recoveryContext.advice,\n retryRecommended: recoveryContext.retryRecommended,\n };\n }\n\n const activeLaunchFailure = getLatestActiveLaunchFailure(mesh.id, node.id);\n if (activeLaunchFailure && node.isLocalWorktree) {\n entry.health = 'degraded';\n entry.degradedReason = 'worktree_launch_failed';\n entry.launchReady = false;\n entry.launchBlockedReason = activeLaunchFailure.code || 'mesh_launch_failed';\n entry.launchBlockedMessage = activeLaunchFailure.error || 'Previous worktree session launch failed';\n entry.lastLaunchFailure = activeLaunchFailure;\n }\n\n const nextStepHints: string[] = [];\n if (entry.degradedReason === 'worktree_launch_failed') {\n nextStepHints.push(`Retry mesh_launch_session(node_id: \"${node.id}\") after daemon mesh transport/P2P is healthy.`);\n nextStepHints.push(`If retry is not desired, cleanup the orphan worktree node with mesh_remove_node(node_id: \"${node.id}\").`);\n } else if (entry.health === 'online' && node.isLocalWorktree) {\n nextStepHints.push(`Merge worktree to base via mesh_refine_node(node_id: \"${node.id}\")`);\n } else if (entry.health === 'dirty') {\n nextStepHints.push(`Commit changes via mesh_checkpoint(node_id: \"${node.id}\", message: \"...\")`);\n } else if (entry.health === 'degraded' && entry.error?.includes('git')) {\n nextStepHints.push('Initialize git repository or check workspace path.');\n }\n\n if (entry.branchConvergence?.needsConvergence === true && entry.branchConvergence.nextStep) {\n nextStepHints.push(String(entry.branchConvergence.nextStep));\n }\n\n if (recoveryContext.consecutiveNodeFailures > 0) {\n if (recoveryContext.retryRecommended) {\n nextStepHints.push(`Retry task on this node or launch a fresh session.`);\n } else {\n nextStepHints.push(`Consider reassigning work to a different node.`);\n }\n }\n\n if (nextStepHints.length > 0) {\n entry.nextStepHints = nextStepHints;\n }\n\n const relatedRepos = await collectRelatedRepoStatuses(ctx, node);\n if (relatedRepos.length) entry.relatedRepos = relatedRepos;\n\n const statusProbe = await collectLiveStatusProbe(ctx, node);\n const liveSessions = statusProbe.sessions;\n // Per-node daemon build stamp (commit/version of the running daemon).\n // Compact mode folds these per-daemonId at the response level, but the\n // raw field is kept on the node so verbose callers and self-coordinator\n // shape stay intact.\n if (statusProbe.daemonBuild) entry.daemonBuild = statusProbe.daemonBuild;\n if (liveSessions.length > 0) {\n // Slim to essential fields only — full session objects are expensive in coordinator context.\n entry.sessions = liveSessions\n .map((s: any) => {\n // A session is marked as a coordinator for THIS mesh when the daemon's\n // coordinator registry / session settings report its meshId matches ours.\n // From the caller's perspective (which is itself a coordinator for this\n // mesh), any such session is \"self\" — i.e. it is the calling coordinator\n // session, not a foreign delegated worker. This prevents the coordinator\n // from mis-reporting its own generating CLI session as someone else's\n // delegated task.\n const coordinatorMeshId =\n typeof s.coordinator?.meshId === 'string' ? s.coordinator.meshId : undefined;\n const isSelfCoordinator = coordinatorMeshId === mesh.id;\n return {\n id: s.instanceId ?? s.id ?? s.sessionId,\n status: s.status ?? s.lifecycle ?? s.state,\n providerType: s.providerType ?? s.cliType ?? s.type,\n ...(s.activeChat?.status ? { chatStatus: s.activeChat.status } : {}),\n ...(isSelfCoordinator ? { isSelfCoordinator: true, role: 'coordinator' as const } : {}),\n // [T2] Carry the worker-computed last-message preview through the slim so\n // the coordinator's inbox can show the worker's latest ASSISTANT reply\n // without re-deriving it from a live in-process instance it doesn't host.\n // The worker's get_status_metadata snapshot already computes these\n // (status/snapshot.ts) from its real transcript; dropping them here forced\n // the coordinator down a derive path that fails for genuinely remote\n // workers, leaving the mobile inbox stuck on the dispatched user task.\n ...(typeof s.lastMessagePreview === 'string' && s.lastMessagePreview\n ? { lastMessagePreview: s.lastMessagePreview } : {}),\n ...(typeof s.lastMessageRole === 'string' && s.lastMessageRole\n ? { lastMessageRole: s.lastMessageRole } : {}),\n ...(typeof s.lastMessageAt === 'number' && Number.isFinite(s.lastMessageAt)\n ? { lastMessageAt: s.lastMessageAt } : {}),\n };\n })\n // Exclude sessions with no resolvable id (malformed or custom provider response).\n .filter((s: any) => s.id);\n }\n\n return entry;\n }));\n\n let ledgerEntries = readLedgerEntries(mesh.id, { tail: 200 });\n let directDispatches = getActiveDirectDispatches(mesh.id);\n const directReconciliation = await reconcileDirectDispatchesFromTranscriptEvidence(ctx, results, directDispatches, ledgerEntries);\n if (directReconciliation.reconciled > 0) {\n ledgerEntries = readLedgerEntries(mesh.id, { tail: 200 });\n directDispatches = getActiveDirectDispatches(mesh.id);\n ledgerSummary = getLedgerSummary(mesh.id);\n }\n const activeWorkEvidence = buildMeshActiveWork({\n meshId: mesh.id,\n queue: getQueue(mesh.id),\n ledgerEntries,\n directDispatches,\n nodes: results,\n });\n\n const pollingGuidance = buildActiveWorkPollingGuidance(activeWorkEvidence.summary);\n const staleDirectWorkSummary = buildCompactStaleDirectWorkSummary(activeWorkEvidence.staleDirectWork, {\n note: activeWorkEvidence.staleDirectWorkNote,\n detailHint: 'Full stale direct entries are omitted from mesh_status by default. Call mesh_status with includeStaleDirectWorkDetails=true or inspect mesh_task_history for ledger detail.',\n });\n // Leak #2: in compact mode each activeWork row drops the duplicated\n // taskSummary/message echoes (keeps a short taskTitle + dispatch scalars).\n // Verbose keeps the full per-record text for debugging.\n const activeWorkForResponse = compact\n ? compactActiveWorkRecords(activeWorkEvidence.activeWork)\n : { records: activeWorkEvidence.activeWork, omitted: 0 };\n\n // Surface coordinator session identity at the top level so the caller (which\n // is itself a coordinator for this mesh) can immediately recognize which\n // sessions in the response are its own — see the per-session\n // `isSelfCoordinator` marker derived above.\n const coordinatorSessions: Array<Record<string, unknown>> = [];\n for (const nodeEntry of results) {\n const sessions = Array.isArray((nodeEntry as any).sessions) ? (nodeEntry as any).sessions : [];\n for (const s of sessions) {\n if (s?.isSelfCoordinator === true && s.id) {\n coordinatorSessions.push({\n nodeId: (nodeEntry as any).nodeId,\n sessionId: s.id,\n providerType: s.providerType,\n status: s.status,\n });\n }\n }\n }\n\n // Compact mode: slim each node's large duplicated `git` blob down to the\n // coordinator-relevant scalars + submodules. branch/health/headCommit/ahead/\n // behind/dirty/upstreamStatus/branchConvergence live as top-level node\n // fields (or inside the slim git snapshot) and are always preserved.\n //\n // Session N×M de-duplication: the per-node session list comes from a\n // daemon-wide `get_status_metadata` probe, so every node that shares a\n // daemonId reports the SAME sessions. Emitting the full array on every node\n // makes the payload grow O(nodes × sessions). In compact mode we therefore\n // (a) fold each node's `sessions` array to a `sessionSummary` (counts only),\n // and (b) emit the full slim session arrays exactly once per daemon under\n // top-level `daemonSessions`. The self-coordinator marker survives in both\n // the per-node summary (`selfCoordinatorSessionIds`) and the top-level\n // `coordinatorSessions`/`selfIdentification`. Individual per-node session\n // detail can be opted back in with `includeSessions=true`.\n const includeSessions = args.includeSessions === true;\n // Top-level per-daemon session map (compact). Sessions are recorded ONCE per\n // daemonId regardless of how many mesh nodes share that daemon, eliminating\n // the N×M duplication. With includeSessions=true the full slim session arrays\n // are emitted; otherwise each daemon is folded to a counts summary.\n const daemonSessions: Record<string, unknown> = {};\n if (compact) {\n const seenDaemons = new Set<string>();\n for (const entry of results as any[]) {\n const daemonId = typeof entry?.daemonId === 'string' && entry.daemonId ? entry.daemonId : '';\n const sessions = Array.isArray(entry?.sessions) ? entry.sessions : [];\n if (daemonId && sessions.length > 0 && !seenDaemons.has(daemonId)) {\n seenDaemons.add(daemonId);\n daemonSessions[daemonId] = includeSessions ? sessions : summarizeNodeSessions(sessions);\n }\n }\n }\n // Per-daemon build fold: the daemon build stamp is identical for every node\n // sharing a daemonId (it's a daemon-wide probe), so record it ONCE per\n // daemonId at the top level. Small field — emitted in both compact and\n // verbose modes so the coordinator can compare the live daemon's commit with\n // a just-merged fix without paging through nodes.\n const daemonBuilds: Record<string, unknown> = {};\n for (const entry of results as any[]) {\n const daemonId = typeof entry?.daemonId === 'string' && entry.daemonId ? entry.daemonId : '';\n if (daemonId && entry?.daemonBuild && !(daemonId in daemonBuilds)) {\n daemonBuilds[daemonId] = entry.daemonBuild;\n }\n }\n // Stale-build aggregate: any node whose live daemon build is behind its\n // workspace HEAD. Deduplicated per daemonId+scope so N worktrees on one\n // stale daemon don't spam N identical warnings.\n const staleDaemonBuilds: Array<Record<string, unknown>> = [];\n const seenStale = new Set<string>();\n for (const entry of results as any[]) {\n const behind = entry?.staleDaemonBuild;\n if (!behind || typeof behind !== 'object') continue;\n const daemonId = typeof entry?.daemonId === 'string' ? entry.daemonId : '';\n const key = `${daemonId}::${behind.scope ?? ''}::${behind.buildCommit ?? ''}::${behind.head ?? ''}`;\n if (seenStale.has(key)) continue;\n seenStale.add(key);\n // web-only stale builds are informational, not \"fix not live\". Only daemon-\n // affecting stale builds (or ones where the classification is unknown →\n // defaulted true) mean a merged daemon/refinery fix is not yet live.\n const isDaemonAffecting = behind.isDaemonAffecting !== false;\n staleDaemonBuilds.push({\n daemonId,\n nodeId: entry.nodeId,\n scope: behind.scope,\n liveBuildCommit: behind.buildCommit,\n liveBuildCommitShort: behind.buildCommitShort,\n head: behind.head,\n isDaemonAffecting,\n ...(Array.isArray(behind.affectedPackages) && behind.affectedPackages.length > 0\n ? { affectedPackages: behind.affectedPackages }\n : {}),\n // The full ~300-char warning prose is identical for every entry and is\n // already emitted ONCE at the top level as `staleDaemonBuildWarning`.\n // Keep it per-entry only in verbose to avoid N× duplication in compact.\n ...(compact ? {} : { warning: behind.warning }),\n });\n }\n const daemonAffectingStaleBuilds = staleDaemonBuilds.filter((b) => b.isDaemonAffecting !== false);\n const webOnlyStaleBuilds = staleDaemonBuilds.filter((b) => b.isDaemonAffecting === false);\n\n let stubbedNodeCount = 0;\n let foldedNodesSummary: Record<string, unknown> | undefined;\n const nodesForResponse = compact\n ? (() => {\n const compacted = results.map((entry: any) => {\n const next = compactMeshStatusNode(entry);\n if (!next || typeof next !== 'object') return next;\n if (Array.isArray(next.sessions)) {\n next.sessionSummary = summarizeNodeSessions(next.sessions);\n // Drop the full per-node array unless explicitly opted in. The\n // de-duplicated full lists are available under top-level\n // `daemonSessions` keyed by daemonId.\n if (!includeSessions) delete next.sessions;\n }\n // Build stamp is folded per-daemon under top-level `daemonBuilds`;\n // drop the repetitive per-node copy in compact mode.\n if (next.daemonBuild !== undefined) delete next.daemonBuild;\n return next;\n });\n\n // Two-tier bounding, highest-severity first:\n // 1. detail byte-budget — noteworthy nodes get full compact detail until\n // COMPACT_DETAILED_NODES_BYTE_BUDGET is spent; the rest degrade to a stub.\n // 2. total node-array byte-budget — quiet/overflow nodes are emitted as\n // minimal stubs until COMPACT_NODES_TOTAL_BYTE_BUDGET is spent; any node\n // beyond that is fully folded into the foldedNodes id-list summary.\n // Nodes that survive in the array keep their ORIGINAL order. Every node id is\n // either in the array (detail or stub) or listed in foldedNodes.nodeIds.\n const noteworthy = compacted.filter((n: any) => n && typeof n === 'object' && isNoteworthyCompactNode(n));\n const ranked = [...noteworthy].sort((a, b) => compactNodeSeverity(b) - compactNodeSeverity(a));\n const detailedIds = new Set<string>();\n let detailSpent = 0;\n for (const n of ranked) {\n const cost = JSON.stringify(n).length + 1;\n if (detailedIds.size === 0 || detailSpent + cost <= COMPACT_DETAILED_NODES_BYTE_BUDGET) {\n detailedIds.add(String(n.nodeId));\n detailSpent += cost;\n }\n }\n\n // severity order for awarding the remaining total budget to stubs\n const stubOrder = [...compacted]\n .filter((n: any) => n && typeof n === 'object')\n .sort((a, b) => compactNodeSeverity(b) - compactNodeSeverity(a));\n const keptIds = new Set<string>(detailedIds);\n let totalSpent = detailSpent;\n for (const n of stubOrder) {\n const id = String(n.nodeId);\n if (keptIds.has(id)) continue;\n const stubCost = JSON.stringify(minimalCompactNode(n)).length + 1;\n if (totalSpent + stubCost <= COMPACT_NODES_TOTAL_BYTE_BUDGET) {\n keptIds.add(id);\n totalSpent += stubCost;\n }\n }\n\n const fullyFolded: any[] = [];\n const out = compacted\n .map((n: any) => {\n if (!n || typeof n !== 'object') return n;\n const id = String(n.nodeId);\n if (detailedIds.has(id)) return n;\n if (keptIds.has(id)) {\n stubbedNodeCount += 1;\n return minimalCompactNode(n);\n }\n fullyFolded.push(n);\n return null;\n })\n .filter((n: any) => n !== null);\n\n if (fullyFolded.length > 0) {\n const byBranchConvergence: Record<string, number> = {};\n const byHealth: Record<string, number> = {};\n const nodeIds: string[] = [];\n for (const n of fullyFolded) {\n const bc = typeof n?.branchConvergence?.status === 'string' ? n.branchConvergence.status : 'unknown';\n byBranchConvergence[bc] = (byBranchConvergence[bc] ?? 0) + 1;\n const h = typeof n?.health === 'string' ? n.health : 'unknown';\n byHealth[h] = (byHealth[h] ?? 0) + 1;\n if (n?.nodeId) nodeIds.push(String(n.nodeId));\n }\n foldedNodesSummary = {\n count: fullyFolded.length,\n note: 'Node-array byte budget reached: these nodes are listed by id only. Query a specific node_id or use verbose=true for their detail.',\n byHealth,\n byBranchConvergence,\n nodeIds,\n };\n }\n return out;\n })()\n : results;\n\n const response: Record<string, unknown> = {\n meshId: mesh.id,\n meshName: mesh.name,\n repoIdentity: mesh.repoIdentity,\n policy: mesh.policy,\n // Mesh-level scheduling rollup (strategy + global cap consumption). Per-node\n // detail (load/priority/provider caps/claim-block reasons) lives on each\n // nodes[].scheduling; the node array is dropped here to avoid duplicating it.\n scheduling: {\n strategy: schedulingRuntime.strategy,\n maxParallelTasks: schedulingRuntime.maxParallelTasks,\n maxReadonlyParallelTasks: schedulingRuntime.maxReadonlyParallelTasks,\n activeWriteAssigned: schedulingRuntime.activeWriteAssigned,\n activeReadonlyAssigned: schedulingRuntime.activeReadonlyAssigned,\n globalWriteCapReached: schedulingRuntime.globalWriteCapReached,\n globalReadonlyCapReached: schedulingRuntime.globalReadonlyCapReached,\n },\n payloadMode: compact ? 'compact' : 'full',\n refreshedAt: new Date().toISOString(),\n sourceOfTruth: {\n membership: 'coordinator_daemon_live_mesh',\n currentStatus: 'live_git_and_session_probes',\n activeWork: 'mesh_queue_file_and_local_ledger',\n historicalEvidenceOnly: ['recoveryHints', 'ledgerSummary'],\n },\n nodes: nodesForResponse,\n ...(compact && stubbedNodeCount > 0\n ? {\n stubbedNodesNote: `${stubbedNodeCount} node(s) in the array above are reduced to a minimal stub (marked folded:true) in compact mode — healthy/clean nodes plus any beyond the detail byte-budget. They remain addressable by node_id; use verbose=true for their full detail.`,\n }\n : {}),\n ...(compact && foldedNodesSummary ? { foldedNodes: foldedNodesSummary } : {}),\n ...(compact && Object.keys(daemonSessions).length > 0 ? { daemonSessions } : {}),\n ...(Object.keys(daemonBuilds).length > 0 ? { daemonBuilds } : {}),\n ...(staleDaemonBuilds.length > 0 ? { staleDaemonBuilds } : {}),\n ...(daemonAffectingStaleBuilds.length > 0\n ? {\n staleDaemonBuildWarning: 'One or more live daemons were built from a commit behind the workspace HEAD with daemon-runtime package changes. Merged refinery/mesh-tool fixes are NOT live on those daemons until they are rebuilt/redeployed and restarted — a local daemon-core dist rebuild does not update a cloud daemon. Do not assume a just-merged fix is active.',\n }\n : {}),\n ...(webOnlyStaleBuilds.length > 0\n ? {\n webOnlyStaleBuildNote: 'One or more live daemons are behind workspace HEAD, but only web packages changed in that range. The daemon does NOT need a rebuild/restart — redeploy the web app to reflect those changes. This is informational, not a \"fix not live\" condition.',\n }\n : {}),\n activeWork: activeWorkForResponse.records,\n ...(compact && activeWorkForResponse.omitted > 0\n ? { activeWorkRowsOmitted: activeWorkForResponse.omitted }\n : {}),\n ...(compact\n ? { activeWorkHint: `Compact activeWork rows carry a short taskTitle + dispatch scalars only; full task prompt/summary text is omitted — use mesh_task_history or mesh_status verbose=true. First ${COMPACT_MAX_ACTIVE_WORK_ROWS} rows serialized.` }\n : {}),\n staleDirectWorkSummary,\n ...(args.includeStaleDirectWorkDetails === true ? { staleDirectWork: activeWorkEvidence.staleDirectWork } : {}),\n // terminalDirectWork is historical (completed/failed direct dispatches) — opt-in only.\n ...(args.includeTerminalDirectWork === true ? { terminalDirectWork: activeWorkEvidence.terminalDirectWork } : {}),\n activeWorkSummary: activeWorkEvidence.summary,\n ...(pollingGuidance ? { pollingGuidance } : {}),\n ...(rateResult.rateLimitExceeded ? { pollingRateAdvisory: { type: 'rate_limit_exceeded', tool: 'mesh_status', callsInWindow: rateResult.callsInWindow, message: rateResult.advisory } } : {}),\n branchConvergenceSummary: summarizeBranchConvergence(results, compact),\n ...(coordinatorSessions.length > 0\n ? {\n coordinatorSessions,\n selfIdentification: {\n meshId: mesh.id,\n coordinatorSessions,\n note: 'Sessions listed here are coordinator sessions for this mesh. The calling coordinator IS one of these sessions — do not treat its own generating CLI session as a foreign delegated task. Per-session marker: sessions[].isSelfCoordinator === true.',\n },\n }\n : {}),\n };\n\n // Include task ledger summary for coordinator context\n try {\n response.ledgerSummary = ledgerSummary;\n } catch { /* ledger read is best-effort */ }\n\n // M3-2: mission summaries — goal + live task aggregates (derived, not stored).\n // M7: each mission also carries time/attempt stats derived from the ledger.\n //\n // The missions section previously dominated the compact payload: every live\n // mission AND up to 10 history missions were emitted in full (goalPreview +\n // tasks + a per-mission stats rollup) on every poll, so a mesh with many\n // missions pushed mesh_status past the MCP token cap. Compact mode now folds\n // missions like it folds nodes/sessions:\n // • live (active/paused) missions keep detail, goal-elided to a tight preview\n // and WITHOUT the stats rollup (the tasks aggregate already carries\n // progress; stats is a verbose/dashboard concern);\n // • completed/abandoned history is folded to a counts + id summary\n // (missionsHistory) instead of full per-mission detail;\n // • a byte budget bounds the live array — overflow folds into foldedMissions\n // (id list), so even a mesh of many active missions can't blow the cap.\n // verbose=true restores the full dashboard-grade missions (full goal text, the\n // stats rollup, and full-detail history) — the backward-compatible escape hatch.\n try {\n if (compact) {\n const { live, historyFold } = getMeshStatusMissionsCompact(mesh.id);\n // Bound the live-mission detail by byte budget, newest-active first.\n // Overflow folds into foldedMissions so every live id stays addressable.\n const ranked = [...live].sort((a, b) =>\n String((b as any).tasks?.lastActivityAt ?? '').localeCompare(String((a as any).tasks?.lastActivityAt ?? '')));\n const kept: any[] = [];\n const overflow: any[] = [];\n let spent = 0;\n for (const m of ranked) {\n const cost = JSON.stringify(m).length + 1;\n if (kept.length === 0 || spent + cost <= COMPACT_MISSIONS_BYTE_BUDGET) {\n kept.push(m);\n spent += cost;\n } else {\n overflow.push(m);\n }\n }\n if (kept.length > 0) response.missions = kept;\n if (overflow.length > 0) {\n const byStatus: Record<string, number> = {};\n for (const m of overflow) byStatus[String(m.status)] = (byStatus[String(m.status)] ?? 0) + 1;\n response.foldedMissions = {\n count: overflow.length,\n note: 'Live-mission byte budget reached: these active/paused missions are listed by id only. Use mesh_mission_list or mesh_status verbose=true for their detail.',\n byStatus,\n missionIds: overflow.map(m => String(m.id)),\n };\n }\n if (historyFold) response.missionsHistory = historyFold;\n } else {\n const missions = getMeshStatusMissionSummaries(mesh.id, { verbose: true });\n if (missions.length > 0) {\n response.missions = missions.map(mission => {\n try {\n return { ...mission, stats: computeMeshMissionStats(mesh.id, mission.id) };\n } catch {\n return mission;\n }\n });\n }\n }\n } catch { /* mission read is best-effort */ }\n\n try {\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\n const asyncRefineJobs = buildMeshAsyncRefineJobs({\n meshId: mesh.id,\n ledgerEntries,\n pendingEvents,\n });\n if (asyncRefineJobs.length > 0) {\n if (compact) {\n // Drop terminal (completed/failed) refine jobs — they are historical and\n // dominate the payload. Keep active (non-terminal) job objects so the\n // coordinator can still track in-flight refines, and replace the rest with\n // a status-count summary.\n //\n // Stale terminal jobs (resolved refinery rejections/successes from earlier\n // in the ledger window — often multi-day-old) are folded out of the counts\n // so byStatus.failed reflects *current* breakage, not historical residue.\n // The folded count is surfaced as `staleTerminal` for transparency.\n const summary = summarizeMeshAsyncRefineJobs(asyncRefineJobs);\n if (summary.activeJobs.length > 0) response.asyncRefineJobs = summary.activeJobs;\n response.asyncRefineJobsSummary = {\n total: summary.total,\n byStatus: summary.byStatus,\n ...(summary.staleTerminal > 0 ? { staleTerminal: summary.staleTerminal } : {}),\n };\n } else {\n response.asyncRefineJobs = asyncRefineJobs;\n }\n }\n if (pendingEvents.length > 0) {\n response.pendingCoordinatorEvents = pendingEvents;\n }\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n return JSON.stringify(response, null, 2);\n}\n\nexport async function meshListNodes(ctx: MeshContext): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const { mesh } = ctx;\n return JSON.stringify({\n meshId: mesh.id,\n meshName: mesh.name,\n nodes: mesh.nodes.map(n => ({\n nodeId: n.id,\n workspace: n.workspace,\n repoRoot: n.repoRoot,\n daemonId: readNodeDaemonId(n),\n machineId: readNodeMachineId(n),\n machine: buildNodeMachineIdentity(ctx, n),\n isLocalWorktree: n.isLocalWorktree,\n policy: n.policy,\n relatedRepos: readRelatedRepos(n),\n ...getNodeLaunchReadiness(n),\n ...buildNodeCapabilityExposure(n),\n userOverrides: n.userOverrides,\n })),\n }, null, 2);\n}\n","// Mesh tool implementations — queue domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n ACTIVE_QUEUE_STATUSES,\n COMPACT_MAX_ACTIVE_QUEUE_ROWS,\n COMPACT_MAX_ACTIVE_WORK_ROWS,\n HISTORICAL_QUEUE_STATUSES,\n IpcTransport,\n annotateQueueStaleness,\n appendLedgerEntry,\n buildActiveWorkPollingGuidance,\n buildCompactQueueMaintenanceReport,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshNodeCapabilityTags,\n buildQueueMaintenanceReport,\n buildQueueStatusSummary,\n buildQueueTriggerGuidance,\n cancelTask,\n collectMeshViewQueueNodesWithLiveSessions,\n compactActiveWorkRecords,\n compactQueueRow,\n compactQueueRows,\n describeTaskDependencyState,\n enqueueTask,\n filterQueueForView,\n getActiveDirectDispatches,\n getQueue,\n ipcDispatchToRemoteAgent,\n isLocalControlPlaneNode,\n markStaleDirectDispatches,\n meshNodeIdMatches,\n nodeSatisfiesRequiredTags,\n normalizeMeshCapabilityTags,\n normalizeQueueViewMode,\n prioritizeActiveQueueRows,\n readLedgerEntries,\n readString,\n reconcileDirectDispatchesFromTranscriptEvidence,\n recordMeshToolCall,\n refreshMeshFromDaemon,\n requeueTask,\n resolvePreferredWorktreeNodeId,\n sanitizeQueueStatusFilter,\n summarizeTaskMessage,\n triggerMeshQueueAndReport,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n QueueViewMode,\n} from './mesh-tools-internal.js';\n\nexport async function meshEnqueueTask(\n ctx: MeshContext,\n args: {\n message: string; task_mode?: string; taskMode?: string;\n requiredTags?: string[]; required_tags?: string[];\n targetNodeId?: string; target_node_id?: string;\n targetNode?: string; target_node?: string;\n preferWorktree?: boolean; prefer_worktree?: boolean;\n dependsOn?: string[]; depends_on?: string[];\n missionId?: string; mission_id?: string;\n },\n): Promise<string> {\n const taskMode = readString(args.task_mode) || readString(args.taskMode);\n const requiredTags = normalizeMeshCapabilityTags(Array.isArray(args.requiredTags) ? args.requiredTags : args.required_tags);\n const dependsOn = Array.isArray(args.dependsOn) ? args.dependsOn : Array.isArray(args.depends_on) ? args.depends_on : undefined;\n const missionId = readString(args.missionId) || readString(args.mission_id) || undefined;\n // Routing hint: explicit target id wins; otherwise prefer_worktree resolves to the\n // most recently cloned worktree node so isolated work is not preemptively claimed by\n // the first idle base node. Either becomes a targetNodeId, which the node-targeted\n // claim tier honors as a HARD constraint (only that node may claim).\n //\n // MESH-DISPATCH-MISROUTE: accept target_node / targetNode in addition to\n // target_node_id / targetNodeId. A coordinator that passed target_node (the natural\n // name) previously had it silently dropped — the task enqueued UNPINNED and any idle\n // node, including a different machine's base, could claim it (the live cross-machine\n // misroute). Resolving every spelling closes that gap.\n const explicitTargetRaw = readString(args.targetNodeId) || readString(args.target_node_id)\n || readString(args.targetNode) || readString(args.target_node) || undefined;\n const preferWorktree = args.preferWorktree === true || args.prefer_worktree === true;\n\n // MESH-DISPATCH-MISROUTE: a target pin is a hard constraint, so an unresolvable target\n // id must FAIL LOUDLY rather than silently fall through to an unpinned (any-node) task.\n // Canonicalize the supplied id to the live mesh node's own id via the shared identity\n // normalizer (handles id / nodeId / node_id and daemon-id forms) so the downstream raw\n // `node.id === targetNodeId` compares and the claim-tier SQL both match exactly.\n let targetNodeId: string | undefined;\n if (explicitTargetRaw) {\n const matched = ctx.mesh.nodes.find(n => meshNodeIdMatches(n as any, explicitTargetRaw));\n if (!matched) {\n return JSON.stringify({\n success: false,\n code: 'target_node_not_found',\n error: `target node '${explicitTargetRaw}' is not a member of this mesh — refusing to enqueue an unpinned task (it could be claimed by any node, including a different machine). Use mesh_list_nodes to get a valid node id.`,\n targetNodeId: explicitTargetRaw,\n availableNodeIds: ctx.mesh.nodes.map(n => (n as any).id).filter(Boolean),\n });\n }\n targetNodeId = readString((matched as any).id) || explicitTargetRaw;\n } else if (preferWorktree) {\n targetNodeId = resolvePreferredWorktreeNodeId(ctx) || undefined;\n }\n try {\n const task = enqueueTask(ctx.mesh.id, args.message, { taskMode, requiredTags, dependsOn, missionId, targetNodeId, ...(ctx.coordinatorSessionId ? { sourceCoordinatorSessionId: ctx.coordinatorSessionId } : {}) });\n\n // ── LocalTransport: queue-based pull (standalone daemon, all local) ─────\n if (!(ctx.transport instanceof IpcTransport)) {\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n return JSON.stringify({\n success: true,\n source: 'queue',\n taskId: task.id,\n status: task.status,\n taskMode: task.taskMode,\n requiredTags: task.requiredTags,\n ...(targetNodeId ? { targetNodeId } : {}),\n ...(preferWorktree && !explicitTargetRaw && !targetNodeId ? { preferWorktreeNoOp: true } : {}),\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n });\n }\n\n // ── IpcTransport (Cloud Mesh): the queue file lives on THIS machine only.\n // Remote daemons on other machines cannot read the local queue file.\n // Strategy: trigger local queue for local nodes, and for remote nodes\n // directly P2P-dispatch to the first idle session found (enqueue-and-push).\n {\n // 1. Trigger local queue for local node pick-up\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n\n // 2. For each remote node, directly dispatch to an idle session via P2P\n const dispatchPromises: Promise<void>[] = [];\n for (const node of ctx.mesh.nodes) {\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n if (isLocalNode || !node.daemonId) continue;\n // When the task targets a specific node, only that node's daemon\n // should receive the P2P push; others would steal the work.\n if (targetNodeId && node.id !== targetNodeId) continue;\n if (!nodeSatisfiesRequiredTags(requiredTags, buildMeshNodeCapabilityTags(node))) continue;\n\n dispatchPromises.push(\n ipcDispatchToRemoteAgent(ctx, node, { message: args.message })\n .then(result => {\n if (result.success) {\n try {\n const providerType = result.providerType;\n const descriptor = summarizeTaskMessage(args.message);\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'task_dispatched',\n nodeId: node.id,\n sessionId: result.sessionId,\n providerType,\n payload: {\n source: 'queue',\n via: 'p2p_direct',\n taskId: task.id,\n message: args.message,\n taskTitle: descriptor.taskTitle,\n taskSummary: descriptor.taskSummary,\n ...(task.taskMode ? { taskMode: task.taskMode } : {}),\n ...(providerType ? { providerType } : {}),\n targetSessionId: result.sessionId,\n },\n });\n } catch { /* best-effort */ }\n }\n })\n .catch((err: any) => {\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'p2p_dispatch_failed',\n nodeId: node.id,\n payload: {\n source: 'queue',\n via: 'p2p_direct',\n taskId: task.id,\n error: err?.message || String(err),\n dispatchFailedAt: new Date().toISOString(),\n },\n });\n } catch { /* best-effort */ }\n }),\n );\n }\n // Fire-and-forget — don't block the coordinator response\n Promise.all(dispatchPromises).catch(() => {});\n\n return JSON.stringify({\n success: true,\n source: 'queue',\n taskId: task.id,\n status: task.status,\n taskMode: task.taskMode,\n requiredTags: task.requiredTags,\n ...(targetNodeId ? { targetNodeId } : {}),\n ...(preferWorktree && !explicitTargetRaw && !targetNodeId ? { preferWorktreeNoOp: true } : {}),\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n });\n }\n } catch (e: any) {\n const message = e?.message || String(e);\n if (message.includes('live_debug_readonly_guardrail_violation')) {\n return JSON.stringify({ success: false, code: 'live_debug_readonly_guardrail_violation', taskMode, error: message });\n }\n if (message.includes('dependency_cycle_detected')) {\n return JSON.stringify({ success: false, code: 'dependency_cycle_detected', dependsOn, error: message });\n }\n return JSON.stringify({ success: false, error: message });\n }\n}\n\nexport async function meshViewQueue(\n ctx: MeshContext,\n args: { status?: string[]; view?: QueueViewMode; compact?: boolean; verbose?: boolean },\n): Promise<string> {\n const rateResult = recordMeshToolCall({ meshId: ctx.mesh.id, tool: 'mesh_view_queue' });\n // Default to the slim payload for LLM callers; verbose forces the full payload.\n const compact = args.verbose === true ? false : (args.compact ?? true);\n try {\n await refreshMeshFromDaemon(ctx);\n const statusFilter = sanitizeQueueStatusFilter(args.status);\n const view = normalizeQueueViewMode(args.view);\n const rawQueue = getQueue(ctx.mesh.id);\n // M1: annotate dependency state (waitingOn, dependenciesSatisfied) at view time.\n const statusById = new Map(rawQueue.map(task => [task.id, task.status]));\n const withDependencies = rawQueue.map(task => {\n if (!Array.isArray(task.dependsOn) || task.dependsOn.length === 0) return task;\n const depState = describeTaskDependencyState(task, statusById);\n return { ...task, ...depState };\n });\n const fullQueue = prioritizeActiveQueueRows(annotateQueueStaleness(withDependencies, ctx.mesh));\n const queue = filterQueueForView(fullQueue, view, statusFilter);\n const summary = buildQueueStatusSummary(fullQueue);\n const visibleSummary = buildQueueStatusSummary(queue);\n const maintenance = buildQueueMaintenanceReport(fullQueue);\n const liveNodes = await collectMeshViewQueueNodesWithLiveSessions(ctx);\n let ledgerEntries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n let directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n const directReconciliation = await reconcileDirectDispatchesFromTranscriptEvidence(ctx, liveNodes, directDispatches, ledgerEntries);\n if (directReconciliation.reconciled > 0) {\n ledgerEntries = readLedgerEntries(ctx.mesh.id, { tail: 200 });\n directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n }\n // Mark dispatched entries with no session activity after 30 min as stale.\n markStaleDirectDispatches(ctx.mesh.id);\n directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n const activeWorkEvidence = buildMeshActiveWork({\n meshId: ctx.mesh.id,\n queue: fullQueue,\n ledgerEntries,\n // Always pass MeshRuntimeStore records (may be empty). buildMeshActiveWork uses them for local\n // dispatches and falls through to ledger scan for remote P2P dispatches not in MeshRuntimeStore.\n directDispatches,\n nodes: liveNodes,\n });\n const recentDispatchFailures = ledgerEntries\n .filter(e => e.kind === 'p2p_dispatch_failed')\n .slice(-20)\n .map(e => ({\n nodeId: e.nodeId,\n taskId: e.payload?.taskId,\n error: e.payload?.error,\n via: e.payload?.via,\n failedAt: e.payload?.dispatchFailedAt || e.timestamp,\n }));\n const staleAssignedTasks = (maintenance as any).staleAssignedTasks || [];\n const requestedHistoricalRows = queue.some((task: any) => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n const pollingGuidance = buildActiveWorkPollingGuidance(activeWorkEvidence.summary);\n\n // Compact mode: completed/failed/cancelled historical row arrays are the main\n // payload bloat (mesh_view_queue has overflowed 250k chars on busy meshes).\n // Drop them in favor of the status counts that summary/visibleSummary already\n // carry, but keep pending/assigned active rows — those drive coordinator\n // dispatch decisions. verbose=true returns every row as before.\n const activeOnlyQueue = queue.filter((task: any) => !HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n // Compact mode: cap active rows and truncate per-row messages (a busy mesh\n // can carry dozens of multi-KB task messages → 70KB+ in the active array).\n const compactQueueResult = compact ? compactQueueRows(activeOnlyQueue) : { rows: activeOnlyQueue, omitted: 0 };\n const visibleQueue = compact ? compactQueueResult.rows : queue;\n const wantActiveQueueArray = view === 'active' || statusFilter?.some(status => ACTIVE_QUEUE_STATUSES.has(status));\n const wantHistoricalQueueArray = !compact && (view === 'historical' || requestedHistoricalRows);\n // activeWork carries the full task message/summary per record — the single\n // largest payload source on a busy mesh. Slim + cap it in compact mode.\n const activeWorkResult = compact\n ? compactActiveWorkRecords(activeWorkEvidence.activeWork)\n : { records: activeWorkEvidence.activeWork, omitted: 0 };\n\n // staleDirectWork is a full MeshActiveWorkRecord[] of orphaned/historical\n // direct dispatches — it is the second major payload-bloat source (the first\n // being historical queue rows). In compact mode, collapse it to the same\n // bounded summary mesh_status uses and only emit the full array in verbose mode.\n const staleDirectWorkSummary = buildCompactStaleDirectWorkSummary(activeWorkEvidence.staleDirectWork, {\n note: activeWorkEvidence.staleDirectWorkNote,\n detailHint: 'Full stale direct entries are omitted from mesh_view_queue in compact mode. Call mesh_view_queue with verbose=true, or inspect mesh_task_history for ledger detail.',\n });\n // queueMaintenance/cleanupDryRun serialize the same maintenance object whose\n // cleanupCandidates array scales with old historical record count. In compact\n // mode drop the per-row arrays in favor of counts.\n const maintenanceForResponse = compact ? buildCompactQueueMaintenanceReport(maintenance) : maintenance;\n\n return JSON.stringify({\n success: true,\n payloadMode: compact ? 'compact' : 'full',\n sourceOfTruth: {\n kind: 'mesh_work_queue_file',\n activeStatuses: ['pending', 'assigned'],\n historicalStatuses: ['completed', 'failed', 'cancelled'],\n notes: 'pending/assigned are active work; completed/failed/cancelled are historical ledger records and never stale assignments.',\n },\n filter: {\n view,\n statuses: statusFilter,\n filtered: Boolean(statusFilter?.length) || view !== 'all',\n },\n queue: visibleQueue,\n ...(compact ? { historicalRowsOmitted: true, historicalRowsHint: 'Completed/failed/cancelled rows are omitted in compact mode; see historicalCounts. Call mesh_view_queue with verbose=true (or view=historical, compact=false) for full rows.' } : {}),\n ...(compact && compactQueueResult.omitted > 0 ? {\n activeRowsOmitted: compactQueueResult.omitted,\n activeRowsHint: `Showing the first ${COMPACT_MAX_ACTIVE_QUEUE_ROWS} active rows (per-row messages truncated). ${compactQueueResult.omitted} more active row(s) omitted — see activeCount/activeCounts for the complete total or use verbose=true.`,\n } : {}),\n activeWork: activeWorkResult.records,\n ...(compact && activeWorkResult.omitted > 0 ? {\n activeWorkOmitted: activeWorkResult.omitted,\n activeWorkHint: `Showing the first ${COMPACT_MAX_ACTIVE_WORK_ROWS} active-work records (messages truncated). ${activeWorkResult.omitted} more omitted — see activeWorkSummary for complete counts or use verbose=true.`,\n } : {}),\n staleDirectWorkSummary,\n ...(compact ? {} : { staleDirectWork: activeWorkEvidence.staleDirectWork }),\n activeWorkSummary: activeWorkEvidence.summary,\n ...(pollingGuidance ? { pollingGuidance } : {}),\n ...(rateResult.rateLimitExceeded ? { pollingRateAdvisory: { type: 'rate_limit_exceeded', tool: 'mesh_view_queue', callsInWindow: rateResult.callsInWindow, message: rateResult.advisory } } : {}),\n summary,\n visibleSummary,\n activeCounts: summary.activeCounts,\n historicalCounts: summary.historicalCounts,\n visibleActiveCounts: visibleSummary.activeCounts,\n visibleHistoricalCounts: visibleSummary.historicalCounts,\n activeCount: summary.activeCount,\n historicalCount: summary.historicalCount,\n visibleActiveCount: visibleSummary.activeCount,\n visibleHistoricalCount: visibleSummary.historicalCount,\n staleAssignedTasks: compact ? staleAssignedTasks.slice(0, 10).map(compactQueueRow) : staleAssignedTasks,\n staleAssignedCount: (maintenance as any).staleAssignedCount,\n queueMaintenance: maintenanceForResponse,\n cleanupDryRun: maintenanceForResponse,\n ...(recentDispatchFailures.length > 0 ? {\n recentDispatchFailures,\n dispatchFailureCount: recentDispatchFailures.length,\n dispatchFailureNote: 'Remote P2P dispatch attempts that failed. Affected tasks remain pending and may require mesh_queue_requeue if no idle session picks them up.',\n } : {}),\n ...(wantActiveQueueArray && !compact ? {\n activeQueue: queue.filter((task: any) => ACTIVE_QUEUE_STATUSES.has(String(task?.status || ''))),\n } : {}),\n // In compact mode the `queue` field already holds exactly the slimmed+\n // capped active rows, so the separate activeQueue array would be a verbatim\n // duplicate (it doubled the payload). Point callers at `queue` instead.\n ...(wantActiveQueueArray && compact ? { activeQueueHint: 'In compact mode the active rows are in `queue` (already filtered to pending/assigned). Use verbose=true for the separate full activeQueue array.' } : {}),\n ...(wantHistoricalQueueArray ? {\n historicalQueue: queue.filter((task: any) => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || ''))),\n } : {}),\n // Back-compat alias for callers already reading the first hardening payload.\n staleAssignments: compact ? staleAssignedTasks.slice(0, 10).map(compactQueueRow) : staleAssignedTasks,\n }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n}\n\nexport async function meshQueueCancel(\n ctx: MeshContext,\n args: { task_id?: string; taskId?: string; reason?: string },\n): Promise<string> {\n try {\n const taskId = (args.task_id || args.taskId || '').trim();\n if (!taskId) return JSON.stringify({ success: false, error: 'task_id required' });\n\n // MESH-DISPATCH-MISROUTE: read the PRE-cancel entry so we know whether the task was\n // already dispatched to a live worker. cancelTask overwrites status to 'cancelled'\n // but preserves assignedSessionId/Node/Provider, so the assignment fields survive —\n // only the status must be captured before the mutation.\n const preCancel = getQueue(ctx.mesh.id).find((t: any) => t?.id === taskId) as {\n status?: string; assignedSessionId?: string; assignedNodeId?: string; assignedProviderType?: string;\n } | undefined;\n const wasAssigned = preCancel?.status === 'assigned';\n const assignedSessionId = readString(preCancel?.assignedSessionId) || undefined;\n const assignedNodeId = readString(preCancel?.assignedNodeId) || undefined;\n const assignedProviderType = readString(preCancel?.assignedProviderType) || undefined;\n\n const task = cancelTask(ctx.mesh.id, taskId, { reason: args.reason });\n if (!task) return JSON.stringify({ success: false, error: `Queue task '${taskId}' not found` });\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n\n // MESH-DISPATCH-MISROUTE (fix 2): cancelling the queue row alone does NOT stop a worker\n // that already claimed the task and is generating — it ran to completion and committed\n // to the (often base) checkout. When the task was dispatched to a live session, propagate\n // a stop so the worker halts its in-flight generation. Guards:\n // - only for an 'assigned' task with a resolvable assignedSessionId (a pending/terminal\n // task has no live worker to stop — sending one would be a no-op at best);\n // - NEVER stop the coordinator's own session (ctx.coordinatorSessionId) — that is the\n // session issuing the cancel, not the worker. Stopping it would kill the coordinator.\n // The stop rides agent_command(action:'stop'), which is already in the router's\n // MESH_FORWARDABLE_SESSION_COMMANDS set: a session hosted on a REMOTE worker daemon is\n // auto-forwarded to that daemon (cross-machine workers are reached), and meshContext.nodeId\n // keeps the fail-closed cross-node scoping AND now seeds the router's deterministic\n // owner-resolution fallback (assignedNodeId → owner daemon) so a worktree-clone worker\n // whose session id missed the coordinator's cached active-sessions snapshot is still reached.\n // CANCEL-STOP false-positive fix: AWAIT the stop and report its REAL outcome\n // (stopped / no response from remote worker daemon / \"CLI agent not running\") instead of\n // pre-stamping attempted:true on a fire-and-forget call. Best-effort: any stop failure is\n // caught and surfaced in workerStop.reason — it must NEVER fail the cancel itself, which\n // already committed the queue 'cancelled' transition above.\n let workerStop: { attempted: boolean; stopped?: boolean; sessionId?: string; nodeId?: string; reason?: string } = { attempted: false };\n if (wasAssigned && assignedSessionId && assignedSessionId !== ctx.coordinatorSessionId && assignedProviderType) {\n workerStop = { attempted: true, sessionId: assignedSessionId, nodeId: assignedNodeId };\n try {\n const stopResult = await ctx.transport.command('agent_command', {\n targetSessionId: assignedSessionId,\n cliType: assignedProviderType,\n agentType: assignedProviderType,\n action: 'stop',\n ...(assignedNodeId ? { meshContext: { meshId: ctx.mesh.id, nodeId: assignedNodeId, taskId } } : {}),\n });\n const stopped = stopResult?.stopped === true || stopResult?.success === true;\n workerStop.stopped = stopped;\n if (!stopped) {\n workerStop.reason = readString(stopResult?.error) || 'worker stop not confirmed';\n }\n } catch (e: any) {\n workerStop.stopped = false;\n workerStop.reason = e?.message || String(e);\n }\n } else if (wasAssigned && assignedSessionId === ctx.coordinatorSessionId) {\n workerStop = { attempted: false, reason: 'assigned_session_is_coordinator_self — stop suppressed' };\n }\n\n return JSON.stringify({ success: true, task, workerStop }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n}\n\nexport async function meshQueueRequeue(\n ctx: MeshContext,\n args: {\n task_id?: string;\n taskId?: string;\n reason?: string;\n target_node_id?: string;\n targetNodeId?: string;\n target_session_id?: string;\n targetSessionId?: string;\n clear_target_node?: boolean;\n clearTargetNode?: boolean;\n keep_target_session?: boolean;\n keepTargetSession?: boolean;\n force?: boolean;\n },\n): Promise<string> {\n try {\n const taskId = (args.task_id || args.taskId || '').trim();\n if (!taskId) return JSON.stringify({ success: false, error: 'task_id required' });\n const targetNodeId = (args.target_node_id || args.targetNodeId || '').trim() || undefined;\n const targetSessionId = (args.target_session_id || args.targetSessionId || '').trim() || undefined;\n const keepTargetSession = args.keep_target_session === true || args.keepTargetSession === true;\n const task = requeueTask(ctx.mesh.id, taskId, {\n reason: args.reason,\n targetNodeId,\n targetSessionId,\n clearTargetNode: args.clear_target_node === true || args.clearTargetNode === true,\n clearTargetSession: targetSessionId ? false : !keepTargetSession,\n force: args.force === true,\n });\n if (!task) return JSON.stringify({ success: false, error: `Queue task '${taskId}' not found` });\n if (task.status === 'failed' && task.cancelReason?.startsWith('max_retries_exceeded')) {\n return JSON.stringify({\n success: false,\n code: 'max_retries_exceeded',\n error: task.cancelReason,\n task,\n hint: 'Use force=true to bypass the retry cap for explicit operator recovery.',\n }, null, 2);\n }\n // Pass the task's target node as preferredNodeId so the trigger claims the\n // requeued task on the intended node's idle session FIRST (router.ts\n // preferred-node tier) before the general round-robin picks a different node.\n // Honours an explicit requeue target_node_id over the persisted one.\n const triggerPreferredNodeId = targetNodeId || task.targetNodeId || undefined;\n ctx.transport.command('trigger_mesh_queue', {\n meshId: ctx.mesh.id,\n ...(triggerPreferredNodeId ? { preferredNodeId: triggerPreferredNodeId } : {}),\n }).catch(() => {});\n return JSON.stringify({ success: true, task }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n}\n","// Mesh tool implementations — mission domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n MESH_MISSION_STATUSES,\n appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n commandForNode,\n computeMeshMissionStats,\n computeMeshTaskStats,\n drainCoordinatorPendingEvents,\n getLedgerSummary,\n isLocalControlPlaneNode,\n listMeshMissionSummaries,\n readLedgerEntries,\n readLedgerSlice,\n readLedgerSliceFromStore,\n readString,\n refreshMeshFromDaemon,\n slimLedgerPayload,\n unwrapCommandPayload,\n upsertMeshMission,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\nexport async function meshTaskHistory(\n ctx: MeshContext,\n args: { tail?: number; kind?: string; compact?: boolean; verbose?: boolean },\n): Promise<string> {\n const { mesh } = ctx;\n // Default to the slim payload for LLM callers; verbose forces full payloads.\n const compact = args.verbose === true ? false : (args.compact ?? true);\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\n // Clamp tail so a large default/explicit value can't blow up the payload in\n // compact mode. Full (verbose) callers may request a deeper window.\n const requestedTail = typeof args.tail === 'number' && args.tail > 0 ? Math.floor(args.tail) : 20;\n // Compact: cap conservatively so even large refine-batch entries can't blow the\n // token limit. slimLedgerPayload is the primary defense (it summarizes large\n // plan/validationPlan/suggestedConfig fields); this clamp is the backstop. A deep\n // explicit request (tail > 50) is clamped harder (20) than a modest one (30).\n const compactCap = requestedTail > 50 ? 20 : 30;\n const tail = compact ? Math.min(requestedTail, compactCap) : Math.min(requestedTail, 200);\n const kind = typeof args.kind === 'string' && args.kind.trim() ? [args.kind.trim() as any] : undefined;\n const rawEntries = readLedgerEntries(mesh.id, { tail, kind });\n // Slim large payload fields so coordinator context stays lean. Verbose\n // returns the raw payloads untouched for full audit detail.\n const entries = compact\n ? rawEntries.map(e => ({\n ...e,\n payload: e.payload ? slimLedgerPayload(e.payload) : e.payload,\n }))\n : rawEntries;\n const summary = getLedgerSummary(mesh.id);\n // M7: per-task time/attempt stats for tasks visible in the returned window.\n // Derived from ledger truth at query time; incomplete evidence is flagged,\n // never estimated.\n let taskStats: unknown[] | undefined;\n try {\n const taskIds = [...new Set(rawEntries\n .map(e => (typeof e.payload?.taskId === 'string' ? e.payload.taskId : ''))\n .filter(Boolean))] as string[];\n if (taskIds.length > 0) {\n const stats = computeMeshTaskStats(mesh.id, { taskIds });\n if (stats.length > 0) taskStats = stats;\n }\n } catch { /* stats are best-effort */ }\n return JSON.stringify({\n meshId: mesh.id,\n payloadMode: compact ? 'compact' : 'full',\n entries,\n summary,\n ...(taskStats ? { taskStats } : {}),\n ...(pendingEvents.length > 0 ? { pendingCoordinatorEvents: pendingEvents } : {}),\n }, null, 2);\n}\n\nexport async function meshRecordNote(\n ctx: MeshContext,\n args: { text?: string; category?: string },\n): Promise<string> {\n const { mesh } = ctx;\n const text = typeof args.text === 'string' ? args.text.trim() : '';\n if (!text) {\n return JSON.stringify({ success: false, error: 'text required' }, null, 2);\n }\n const category = args.category === 'provider_quirk' || args.category === 'pattern_to_avoid' || args.category === 'recovery_lesson'\n ? args.category\n : undefined;\n const createdAt = new Date().toISOString();\n // sourceCoordinator: best-effort identity of the recording coordinator so a\n // future coordinator can attribute the note. Session id is the most precise;\n // fall back to the daemon/hostname.\n const sourceCoordinator = ctx.coordinatorSessionId || ctx.localDaemonId || ctx.coordinatorHostname || undefined;\n const entry = appendLedgerEntry(mesh.id, {\n kind: 'coordinator_operating_note',\n ...(sourceCoordinator ? { sessionId: sourceCoordinator } : {}),\n payload: {\n text,\n ...(category ? { category } : {}),\n createdAt,\n ...(sourceCoordinator ? { sourceCoordinator } : {}),\n },\n });\n return JSON.stringify({\n success: true,\n meshId: mesh.id,\n noteId: entry.id,\n recorded: { text, category: category ?? null, createdAt },\n note: 'Recorded to the mesh ledger. Future coordinators on this mesh will see it under \"## Operating Notes\" at launch.',\n }, null, 2);\n}\n\nexport async function meshReconcileLedger(\n ctx: MeshContext,\n args: { node_ids?: string[]; limit?: number; after_id?: string; since?: string; import_entries?: boolean },\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const requestedNodeIds = Array.isArray(args.node_ids)\n ? new Set(args.node_ids.map(id => typeof id === 'string' ? id.trim() : '').filter(Boolean))\n : null;\n const nodes = ctx.mesh.nodes.filter(node => !requestedNodeIds || requestedNodeIds.has(node.id));\n const replicas: any[] = [];\n const shouldImport = args.import_entries !== false;\n const queryArgs = {\n meshId: ctx.mesh.id,\n ...(typeof args.limit === 'number' ? { limit: args.limit } : {}),\n ...(typeof args.after_id === 'string' && args.after_id.trim() ? { afterId: args.after_id.trim() } : {}),\n ...(typeof args.since === 'string' && args.since.trim() ? { since: args.since.trim() } : {}),\n };\n\n for (const node of nodes) {\n try {\n if (isLocalControlPlaneNode(ctx, node) || !node.daemonId) {\n // G4: Use SQLite mesh_event_ledger (bounded slice) as the local P2P reconcile read path.\n // readLedgerSlice (JSONL) is retained for per-daemon P2P export; coordinator local reads use SQLite.\n const slice = readLedgerSliceFromStore(ctx.mesh.id, queryArgs);\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'local',\n slice,\n status: 'local',\n }));\n continue;\n }\n\n const result = await commandForNode(ctx, node, 'get_mesh_ledger_slice', queryArgs);\n const payload = unwrapCommandPayload(result);\n if (payload?.success === false) {\n throw new Error(payload.error || 'remote get_mesh_ledger_slice failed');\n }\n const slice = payload?.slice ?? payload;\n if (slice?.protocol !== 'adhdev.mesh.ledger.slice.v1' || !Array.isArray(slice.entries)) {\n throw new Error('remote daemon returned an invalid ledger slice payload');\n }\n const importResult = shouldImport\n ? appendRemoteLedgerEntries(ctx.mesh.id, slice.entries)\n : { accepted: 0, skippedDuplicate: 0, rejectedInvalid: 0, entries: [] };\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'p2p_datachannel',\n slice,\n importResult,\n }));\n if (shouldImport && importResult.accepted > 0) {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_replicated',\n nodeId: node.id,\n payload: {\n protocol: 'adhdev.mesh.ledger.slice.v1',\n imported: importResult.accepted,\n skippedDuplicate: importResult.skippedDuplicate,\n rejectedInvalid: importResult.rejectedInvalid,\n nextAfterId: slice.cursor?.nextAfterId ?? null,\n via: 'p2p_datachannel',\n },\n });\n }\n } catch (e: any) {\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: node.daemonId ? 'p2p_datachannel' : 'local',\n status: 'failed',\n error: e?.message ?? String(e),\n }));\n }\n }\n\n const evidence = buildMeshLedgerReconciliationEvidence(ctx.mesh.id, replicas);\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_reconciled',\n payload: {\n protocol: evidence.protocol,\n sourceOfTruth: evidence.sourceOfTruth,\n totals: evidence.totals,\n convergence: evidence.convergence,\n },\n });\n return JSON.stringify({ success: true, evidence }, null, 2);\n}\n\nexport async function meshMissionUpsert(\n ctx: MeshContext,\n args: { mission_id?: string; missionId?: string; title: string; goal?: string; status?: string },\n): Promise<string> {\n try {\n const mission = upsertMeshMission(ctx.mesh.id, {\n id: readString(args.mission_id) || readString(args.missionId) || undefined,\n title: args.title,\n goal: typeof args.goal === 'string' ? args.goal : undefined,\n status: readString(args.status) || undefined,\n });\n return JSON.stringify({\n success: true,\n mission,\n nextAction: 'Attach tasks with mesh_enqueue_task mission_id and depends_on. mesh_status shows live task aggregates for this mission.',\n });\n } catch (e: any) {\n const message = e?.message || String(e);\n const code = message.includes('mission_title_required') ? 'mission_title_required'\n : message.includes('invalid_mission_status') ? 'invalid_mission_status'\n : undefined;\n return JSON.stringify({ success: false, ...(code ? { code } : {}), error: message });\n }\n}\n\nexport async function meshMissionList(\n ctx: MeshContext,\n args: { status?: string | string[]; verbose?: boolean } = {},\n): Promise<string> {\n try {\n const rawStatuses = Array.isArray(args.status)\n ? args.status\n : typeof args.status === 'string' && args.status.trim()\n ? [args.status]\n : [];\n const invalid = rawStatuses.filter(s => !MESH_MISSION_STATUSES.includes(s as any));\n if (invalid.length > 0) {\n return JSON.stringify({\n success: false,\n code: 'invalid_mission_status',\n error: `invalid status filter: ${invalid.join(', ')} (valid: ${MESH_MISSION_STATUSES.join(', ')})`,\n });\n }\n const statuses = rawStatuses.length > 0 ? (rawStatuses as any[]) : undefined;\n const missions = listMeshMissionSummaries(ctx.mesh.id, {\n statuses,\n verbose: args.verbose === true,\n }).map(mission => {\n try {\n return { ...mission, stats: computeMeshMissionStats(ctx.mesh.id, mission.id) };\n } catch {\n return mission;\n }\n });\n return JSON.stringify({\n success: true,\n count: missions.length,\n ...(statuses ? { statusFilter: statuses } : {}),\n missions,\n }, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e?.message || String(e) });\n }\n}\n\nexport async function meshReviewInbox(\n ctx: MeshContext,\n args: { mesh_id?: string } = {},\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const meshId = (args.mesh_id ?? ctx.mesh.id).trim();\n const result = await commandForNode(ctx, ctx.mesh.nodes[0], 'get_mesh_review_inbox', {\n meshId,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n","// Mesh tool implementations — session domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n IpcTransport,\n SESSION_PROVIDER_METADATA_TTL_MS,\n annotateRapidReadChatAdvisory,\n appendLedgerEntry,\n buildCoordinatorP2pRelayFailure,\n buildDirectTaskPayload,\n buildMeshActiveWork,\n buildMeshReadChatCacheFallback,\n buildMissingCoordinatorDaemonIdFailure,\n buildMissingNodeReadChatRecovery,\n buildQueueTriggerGuidance,\n collectLiveStatusProbe,\n collectMeshViewQueueNodesWithLiveSessions,\n commandForNode,\n compactChatPayload,\n deleteDirectDispatchesByTaskId,\n drainCoordinatorPendingEvents,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n extractLaunchPayload,\n extractStatusMetadataSessions,\n findNodeWithRefresh,\n findOptionalNodeWithRefresh,\n getActiveDirectDispatches,\n getQueue,\n getSessionMetadata,\n getWorktreeBootstrapLaunchBlock,\n hasRecentDuplicateDispatch,\n insertDirectDispatch,\n ipcDispatchToRemoteAgent,\n isIdleSessionRecord,\n isLocalControlPlaneNode,\n isMeshCoordinatorSessionRecord,\n isMeshOwnedDelegateSession,\n isP2pRelayTransportFailure,\n isTerminalSessionRecord,\n isUnmanagedSessionRecord,\n isWorkerTaskMode,\n meshSessionCacheKey,\n meshSessionProviderMetadata,\n missingProviderPriorityMessage,\n pruneStaleDirectDispatches,\n randomUUID,\n readLedgerEntries,\n readProviderPriority,\n readSessionRecordId,\n readSpawnedSessionVisibility,\n readString,\n recordDirectDispatchTask,\n recordRecoverableLaunchFailure,\n refreshMeshFromDaemon,\n resolveCoordinatorDaemonId,\n resolveCoordinatorNode,\n resolveDelegatedWorkerAutoApprove,\n resolveMeshSessionProviderMetadata,\n resolveSessionProviderType,\n triggerMeshQueueAndReport,\n unwrapCommandPayload,\n validateMeshTaskModeRequest,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\n\n/**\n * Prune orphaned staleDirect dispatch records — direct dispatches whose original node/session is\n * no longer present in the live mesh (or terminal). dry_run (default) reports exactly which\n * taskIds would be pruned without mutating anything; pass execute=true to actually remove them.\n *\n * Safety:\n * - Only records classified as staleDirectWork by buildMeshActiveWork against the CURRENT live\n * mesh are eligible — active/pending/assigned/generating work is never in that set.\n * - Of those, only orphans (node/session gone) are pruned. Fresh unacknowledged dispatch\n * failures (staleDispatchUnacknowledged: node/session still live) are explicitly preserved and\n * reported under preservedUnacknowledged so the caller can recover them.\n * - Pruning deletes only the mesh_direct_dispatches store rows; the append-only mesh ledger\n * (audit history) is left intact, and a direct_dispatch_pruned ledger entry is appended on\n * execute so the prune itself is auditable.\n */\nexport async function meshPruneStaleDirect(\n ctx: MeshContext,\n args: { execute?: boolean; dry_run?: boolean; include_terminal?: boolean } = {},\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n // execute must be explicit; dry_run is the default unless execute===true.\n const execute = args.execute === true && args.dry_run !== true;\n const includeTerminal = args.include_terminal === true;\n\n const liveNodes = await collectMeshViewQueueNodesWithLiveSessions(ctx);\n const ledgerEntries = readLedgerEntries(ctx.mesh.id, { tail: 500 });\n const directDispatches = getActiveDirectDispatches(ctx.mesh.id);\n\n // Manual prune is immediate (minAgeMs omitted → 0). The same prune core powers the daemon\n // reconcile-loop auto-prune, which passes a conservative age gate. Keeping a single core\n // means the safety classification + audit-ledger behavior can never drift between the two.\n const result = pruneStaleDirectDispatches({\n meshId: ctx.mesh.id,\n queue: getQueue(ctx.mesh.id),\n ledgerEntries,\n directDispatches,\n nodes: liveNodes,\n execute,\n includeTerminal,\n source: 'mesh_prune_stale_direct',\n });\n\n const { prunable, prunedCount, preservedUnacknowledged, preservedLedgerOnly, preservedNotOrphan } = result;\n\n const summarize = (records: typeof prunable) => records.map(r => ({\n taskId: r.taskId,\n nodeId: r.nodeId,\n sessionId: r.sessionId,\n status: r.status,\n terminal: r.terminal === true,\n staleReason: r.staleReason,\n taskTitle: r.taskTitle,\n createdAt: r.createdAt,\n }));\n\n return JSON.stringify({\n success: true,\n mode: result.mode,\n meshId: ctx.mesh.id,\n includeTerminal,\n candidateCount: result.candidateCount,\n prunableCount: prunable.length,\n prunedCount,\n prunable: summarize(prunable),\n preserved: {\n unacknowledgedCount: preservedUnacknowledged.length,\n ledgerOnlyCount: preservedLedgerOnly.length,\n notOrphanCount: preservedNotOrphan.length,\n unacknowledged: summarize(preservedUnacknowledged),\n ledgerOnly: summarize(preservedLedgerOnly),\n notOrphan: summarize(preservedNotOrphan),\n },\n note: execute\n ? `Pruned ${prunedCount} orphaned direct dispatch record(s) from the active staleDirect surface. The append-only mesh ledger audit history is preserved; a direct_dispatch_pruned entry records this prune.`\n : 'Dry run — nothing was deleted. Re-run with execute=true to prune the listed orphaned records. Fresh unacknowledged dispatch failures (node/session still live) and ledger-only audit entries are always preserved.',\n }, null, 2);\n}\n\nexport async function meshSendTask(\n ctx: MeshContext,\n args: {\n node_id: string; session_id?: string; message: string;\n task_mode?: string; taskMode?: string;\n mission_id?: string; missionId?: string;\n },\n): Promise<string> {\n const requestedTaskMode = readString(args.task_mode) || readString(args.taskMode);\n // Optional mission attribution. When set, the direct-dispatched task is also\n // materialised as an assigned queue entry so it counts toward the mission's\n // task aggregates — see recordDirectDispatchTask. Absent → unattributed\n // direct dispatch as before (backward compatible).\n const missionId = readString(args.missionId) || readString(args.mission_id) || undefined;\n const modeValidation = validateMeshTaskModeRequest(requestedTaskMode, args.message);\n if (!modeValidation.valid) {\n return JSON.stringify({\n success: false,\n code: 'live_debug_readonly_guardrail_violation',\n taskMode: modeValidation.taskMode || requestedTaskMode,\n violations: modeValidation.violations,\n allowedOperations: modeValidation.allowedOperations,\n error: `live_debug_readonly_guardrail_violation: forbidden operations (${modeValidation.violations.join(', ')})`,\n });\n }\n const taskMode = modeValidation.taskMode;\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n // Policy check: read-only node cannot receive tasks\n if (node.policy?.readOnly) {\n return JSON.stringify({ error: `Node '${args.node_id}' is read-only` });\n }\n\n // WTDISPATCH-FANOUT: a `convergence` task lands its work onto base (merge → push →\n // cleanup) and is base-only. Refuse a direct dispatch that targets a worktree-clone\n // node, fail-closed — co-located sibling worktree sessions racing a convergence\n // push/production-deploy is exactly the 4-way fan-out the live repro hit. Mirrors the\n // queue claim guard (claimNextQueueTask) and the auto-launch eligibility filter so the\n // base-only invariant holds across every dispatch entry point.\n if (taskMode === 'convergence' && node.isLocalWorktree === true) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_convergence_target_is_worktree',\n reason: 'mesh_convergence_target_is_worktree',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode,\n error: `Node '${args.node_id}' is a worktree clone; a convergence task is base-only (it merges/pushes onto base). Dispatching it to a worktree session risks a multi-worktree push/deploy race.`,\n nextAction: `Dispatch the convergence task to the base node for this mesh, or run the deterministic fast-forward convergence path (mesh_fast_forward_node / mesh_refine_node) instead of mesh_send_task.`,\n });\n }\n\n let explicitTargetSession: any | undefined;\n if (args.session_id && isWorkerTaskMode(taskMode)) {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n explicitTargetSession = sessions.find(session => readSessionRecordId(session) === args.session_id);\n if (explicitTargetSession && isMeshCoordinatorSessionRecord(explicitTargetSession)) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_is_coordinator',\n reason: 'mesh_target_session_is_coordinator',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n error: `Session '${args.session_id}' is a Repo Mesh coordinator session, not a visible worker session. Launch or use a visible worker session before dispatching this task.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' and then retry mesh_send_task with that worker session_id, or use mesh_enqueue_task for queue-based worker assignment.`,\n });\n }\n if (explicitTargetSession && isUnmanagedSessionRecord(explicitTargetSession)) {\n // Session exists but lacks mesh delegation metadata (no meshNodeFor,\n // meshCoordinatorFor, or launchedByCoordinator). It could be:\n // - The coordinator's own session → self-send risk\n // - A manually launched session not associated with this mesh\n // Completion events from this session would not reach the coordinator\n // ledger. Surface a hard warning but still record the dispatch attempt\n // in the result so the coordinator can decide whether to proceed.\n //\n // Note: if the session happens to have meshCoordinatorFor set, the check\n // above would have already returned mesh_target_session_is_coordinator.\n // This warning fires only for truly unmanaged sessions.\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_unmanaged',\n reason: 'mesh_target_session_unmanaged',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n unsafeTranscriptAlias: true,\n error: `Session '${args.session_id}' on node '${args.node_id}' has no Repo Mesh delegation metadata (missing meshNodeFor/meshCoordinatorFor/launchedByCoordinator). It may be the coordinator's own session or an unrelated session — dispatching risks self-send and orphaned completion events that never reach the coordinator ledger.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' to start a fresh managed worker session, then retry mesh_send_task with the returned session_id. Alternatively use mesh_enqueue_task for queue-based assignment without specifying session_id.`,\n });\n }\n } catch {\n explicitTargetSession = undefined;\n }\n }\n\n // Avoid duplicate side effects when an MCP/tool call is interrupted after\n // the daemon already accepted the send and the coordinator retries the\n // exact same node/session/message immediately.\n const duplicate = hasRecentDuplicateDispatch(ctx, args);\n if (duplicate.duplicate) {\n return JSON.stringify({\n success: true,\n duplicate: true,\n dispatched: false,\n warning: 'Duplicate mesh_send_task suppressed: the same node/session/message was dispatched recently.',\n nodeId: args.node_id,\n sessionId: args.session_id,\n source: duplicate.source,\n previousDispatch: duplicate.entry ? {\n id: duplicate.entry.id,\n timestamp: duplicate.entry.timestamp || duplicate.entry.updatedAt || duplicate.entry.createdAt,\n nodeId: duplicate.entry.nodeId || duplicate.entry.targetNodeId || duplicate.entry.assignedNodeId,\n sessionId: duplicate.entry.sessionId || duplicate.entry.targetSessionId || duplicate.entry.assignedSessionId,\n } : undefined,\n });\n }\n\n try {\n // ── IpcTransport + remote node: direct P2P agent_command dispatch ──────\n //\n // The local queue file (mesh-ledger/*.queue.json) is stored on THIS\n // machine and is inaccessible to the remote daemon. Sending\n // trigger_mesh_queue to the remote daemon would always be a no-op\n // because it cannot read the queue. Instead we relay agent_command\n // directly over P2P so the remote daemon forwards it to its agent.\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n if (ctx.transport instanceof IpcTransport && node.daemonId && !isLocalNode) {\n const cached = getSessionMetadata(meshSessionCacheKey(args.node_id, args.session_id || ''));\n const taskId = randomUUID();\n const coordinatorDaemonId = resolveCoordinatorDaemonId(ctx);\n const result = await ipcDispatchToRemoteAgent(ctx, node, {\n session_id: args.session_id,\n message: args.message,\n providerType: cached?.providerType,\n verifiedSession: explicitTargetSession,\n meshContext: {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n taskId,\n ...(coordinatorDaemonId ? { coordinatorDaemonId } : {}),\n // (3) Stamp the originating coordinator session so the worker's completion\n // routes back to THIS coordinator session (multi-coordinator). Survives the\n // P2P dispatch to the remote worker, which echoes it on its completion event.\n ...(ctx.coordinatorSessionId ? { coordinatorSessionId: ctx.coordinatorSessionId } : {}),\n },\n });\n if (result.success) {\n // Record dispatch in ledger so task_history is accurate.\n // Defensive guard: a sessionless dispatch must not record the\n // provider type as a session id (an older ipcDispatch fallback\n // returned resolvedProviderType in result.sessionId). If the\n // returned sessionId equals the provider type, treat it as\n // sessionless so completion matching falls back to taskId.\n const resultSessionId = result.sessionId\n && result.providerType\n && result.sessionId === result.providerType\n ? ''\n : result.sessionId;\n const dispatchedSessionId = args.session_id || resultSessionId;\n const dispatchedAt = new Date().toISOString();\n try {\n const providerType = result.providerType || cached?.providerType;\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'task_dispatched',\n nodeId: args.node_id,\n sessionId: dispatchedSessionId,\n providerType,\n payload: buildDirectTaskPayload(args.message, 'p2p_direct', {\n taskId,\n taskMode,\n providerType,\n targetSessionId: dispatchedSessionId,\n }),\n });\n insertDirectDispatch(ctx.mesh.id, {\n taskId,\n nodeId: args.node_id,\n sessionId: dispatchedSessionId,\n providerType: providerType || undefined,\n message: args.message,\n taskMode: taskMode || undefined,\n via: 'p2p_direct',\n dispatchedAt,\n });\n if (missionId) {\n recordDirectDispatchTask(ctx.mesh.id, args.message, {\n id: taskId,\n missionId,\n assignedNodeId: args.node_id,\n assignedSessionId: dispatchedSessionId,\n taskMode,\n dispatchedAt,\n });\n }\n } catch { /* best-effort */ }\n }\n const returnedSessionId = result.sessionId\n && result.providerType\n && result.sessionId === result.providerType\n ? ''\n : result.sessionId;\n return JSON.stringify({\n ...result,\n nodeId: args.node_id,\n sessionId: result.success ? (args.session_id || returnedSessionId) : args.session_id,\n ...(result.success ? { source: 'direct', taskId } : {}),\n taskMode,\n ...(result.success && result.providerType ? { providerType: result.providerType } : {}),\n dispatched: result.success === true,\n });\n }\n\n // ── LocalTransport or local IpcTransport node ────────────────────────\n // If the coordinator explicitly targets a runtime session, push directly\n // and surface route failures immediately instead of creating a queue item\n // that can remain pending forever when the session was already stopped.\n if (args.session_id) {\n const cached = getSessionMetadata(meshSessionCacheKey(args.node_id, args.session_id));\n let resolvedProviderType = cached?.providerType || '';\n if (!resolvedProviderType) {\n let explicitSession = explicitTargetSession;\n if (!explicitSession) {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n explicitSession = sessions.find(session => readSessionRecordId(session) === args.session_id);\n }\n if (!explicitSession) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_not_found',\n reason: 'mesh_target_session_not_found',\n transport: 'local_ipc',\n retryRecommended: true,\n nodeId: args.node_id,\n sessionId: args.session_id,\n error: `Local session '${args.session_id}' is not present in live status for node '${args.node_id}'.`,\n nextAction: `Launch a fresh session with mesh_launch_session(node_id: '${args.node_id}') or retry without session_id so Repo Mesh can target a live delegate session.`,\n });\n }\n // The early validation block only runs for isWorkerTaskMode (excludes\n // live_debug_readonly). Apply the same coordinator/unmanaged checks here\n // for sessions resolved in this path so no task mode bypasses them.\n if (isMeshCoordinatorSessionRecord(explicitSession)) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_is_coordinator',\n reason: 'mesh_target_session_is_coordinator',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n error: `Session '${args.session_id}' is a Repo Mesh coordinator session, not a visible worker session. Launch or use a visible worker session before dispatching this task.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' and then retry mesh_send_task with that worker session_id, or use mesh_enqueue_task for queue-based worker assignment.`,\n });\n }\n if (isUnmanagedSessionRecord(explicitSession)) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_unmanaged',\n reason: 'mesh_target_session_unmanaged',\n nodeId: args.node_id,\n sessionId: args.session_id,\n taskMode: taskMode || 'unspecified',\n unsafeTranscriptAlias: true,\n unsafeDelegateTarget: true,\n error: `Session '${args.session_id}' on node '${args.node_id}' has no Repo Mesh delegation metadata (missing meshNodeFor/meshCoordinatorFor/launchedByCoordinator). It may be the coordinator's own session or an unrelated session — dispatching risks self-send and orphaned completion events that never reach the coordinator ledger.`,\n nextAction: `Call mesh_launch_session for node '${args.node_id}' to start a fresh managed worker session, then retry mesh_send_task with the returned session_id. Alternatively use mesh_enqueue_task for queue-based assignment without specifying session_id.`,\n });\n }\n resolvedProviderType = resolveSessionProviderType(explicitSession);\n if (resolvedProviderType) {\n meshSessionProviderMetadata.set(meshSessionCacheKey(args.node_id, args.session_id), {\n providerType: resolvedProviderType,\n providerSessionId: readString(explicitSession?.providerSessionId) || undefined,\n expiresAt: Date.now() + SESSION_PROVIDER_METADATA_TTL_MS,\n });\n }\n }\n if (!resolvedProviderType) {\n return JSON.stringify({\n success: false,\n recoverable: true,\n code: 'mesh_target_session_provider_unknown',\n reason: 'mesh_target_session_provider_unknown',\n transport: 'local_ipc',\n retryRecommended: false,\n nodeId: args.node_id,\n sessionId: args.session_id,\n error: `Local session '${args.session_id}' is live but does not expose providerType/cliType, so agent_command cannot be routed safely.`,\n nextAction: `Relaunch the target session on node '${args.node_id}' or retry without session_id so Repo Mesh can pick a session with provider metadata.`,\n });\n }\n // Apply delivery policy: check session status and decide immediate vs queued vs rejected.\n // Busy/generating sessions must not receive immediate send_chat injection.\n if (explicitTargetSession && !isIdleSessionRecord(explicitTargetSession) && !isTerminalSessionRecord(explicitTargetSession)) {\n const sessionStatus = typeof explicitTargetSession?.status === 'string' ? explicitTargetSession.status : 'unknown';\n const { createSessionDelivery: createDelivery, resolveDeliveryDecision } = await import('@adhdev/daemon-core');\n const policyResult = resolveDeliveryDecision(sessionStatus, { kind: 'task' });\n if (policyResult.decision === 'queued') {\n const delivery = createDelivery({\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType,\n kind: 'task',\n message: args.message,\n status: 'queued',\n });\n return JSON.stringify({\n success: true,\n dispatched: false,\n decision: 'queued_delivery',\n deliveryId: delivery.id,\n reason: policyResult.reason,\n nodeId: args.node_id,\n sessionId: args.session_id,\n sessionStatus,\n taskMode: taskMode || undefined,\n message: policyResult.message,\n nextAction: `Use mesh_status to watch for session idle transition, or use mesh_enqueue_task for queue-based assignment. Check deliveryId '${delivery.id}' to track queued delivery.`,\n });\n }\n }\n\n // Detect whether the session was idle at dispatch time. An idle session that\n // receives agent_command/send_chat should transition to generating. If it stays\n // idle, the dispatch was not acknowledged. Record this for stale detection and\n // surface it as a dispatchAcknowledgementRisk warning in the success response.\n const sessionWasIdle = explicitTargetSession\n ? isIdleSessionRecord(explicitTargetSession)\n : false;\n const taskId = randomUUID();\n const dispatchedAt = new Date().toISOString();\n const coordinatorDaemonId = resolveCoordinatorDaemonId(ctx);\n // CANON-A (direct-dispatch completion race — root fix): record the dispatch row\n // (task_dispatched ledger + insertDirectDispatch) ★BEFORE the agent_command inject,\n // exactly as the enqueue→claim path does (tryAssignQueueTask atomically claims the\n // queue row 'assigned' before deliverTaskToSession injects). A FAST direct dispatch to\n // an already-idle, reused session could otherwise have its genuine completion reach the\n // coordinator forwarder BEFORE this row existed → sessionHasActiveAssignment=false → the\n // prior-terminal providerSessionId dedup (mesh-event-forwarding.ts:551,603) swallowed the\n // new task's completion as a duplicate of the prior turn. Pre-recording makes\n // sessionHasActiveAssignment=true at completion time, so the dedup gate is skipped\n // symmetrically with enqueue. On a dispatch failure below we roll the row back.\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'task_dispatched',\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType,\n payload: buildDirectTaskPayload(args.message, 'local_direct', {\n taskId,\n taskMode,\n providerType: resolvedProviderType,\n targetSessionId: args.session_id,\n dispatchedToIdleSession: sessionWasIdle,\n }),\n });\n } catch { /* best-effort */ }\n insertDirectDispatch(ctx.mesh.id, {\n taskId,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType || undefined,\n message: args.message,\n taskMode: taskMode || undefined,\n via: 'local_direct',\n dispatchedToIdleSession: sessionWasIdle,\n dispatchedAt,\n });\n // Stamp the mesh assignment via meshContext so the daemon can\n // attach it to the target instance BEFORE prompt injection.\n // setupMeshEventForwarding reads state.settings.meshNodeFor +\n // meshActiveTaskId to route completion events back. Without\n // this, plain CLI sessions targeted by mesh_send_task --direct\n // would silently drop generating_completed and the coordinator\n // would never observe task_completed.\n // coordinatorDaemonId is required so the completion event is\n // routed to the correct coordinator pendingCoordinatorEvents queue.\n const dispatchResult = await commandForNode(ctx, node, 'agent_command', {\n targetSessionId: args.session_id,\n agentType: resolvedProviderType,\n cliType: resolvedProviderType,\n providerType: resolvedProviderType,\n action: 'send_chat',\n message: args.message,\n meshContext: {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n taskId,\n ...(coordinatorDaemonId ? { coordinatorDaemonId } : {}),\n // (3) Originating coordinator session anchor — see the remote-dispatch path above.\n ...(ctx.coordinatorSessionId ? { coordinatorSessionId: ctx.coordinatorSessionId } : {}),\n },\n });\n const dispatchPayload = unwrapCommandPayload(dispatchResult);\n if (dispatchPayload?.success === false || dispatchResult?.success === false) {\n // Roll back the pre-recorded dispatch row: the inject was rejected, so there is no\n // active assignment to gate. The task_dispatched ledger entry stays (append-only),\n // but the dispatch row is the discriminator sessionHasActiveAssignment keys on —\n // leaving it would mask a genuinely-unrelated later idle as an active assignment.\n try { deleteDirectDispatchesByTaskId(ctx.mesh.id, [taskId]); } catch { /* best-effort */ }\n const source = dispatchPayload?.success === false ? dispatchPayload : dispatchResult;\n return JSON.stringify({\n ...(source && typeof source === 'object' ? source : {}),\n success: false,\n nodeId: args.node_id,\n sessionId: args.session_id,\n error: dispatchPayload?.error || dispatchResult?.error || 'agent_command rejected the task',\n });\n }\n if (missionId) {\n try {\n recordDirectDispatchTask(ctx.mesh.id, args.message, {\n id: taskId,\n missionId,\n assignedNodeId: args.node_id,\n assignedSessionId: args.session_id,\n taskMode,\n dispatchedAt,\n });\n } catch { /* best-effort */ }\n }\n // Create a delivery record for session-level ACK tracking\n let deliveryId: string | undefined;\n try {\n const { createSessionDelivery: createDelivery } = await import('@adhdev/daemon-core');\n const delivery = createDelivery({\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n sessionId: args.session_id,\n providerType: resolvedProviderType || undefined,\n taskId,\n kind: 'task',\n message: args.message,\n status: sessionWasIdle ? 'delivered' : 'delivering',\n });\n deliveryId = delivery.id;\n } catch { /* best-effort */ }\n return JSON.stringify({\n success: true,\n dispatched: true,\n decision: 'immediate',\n source: 'direct',\n taskId,\n deliveryId,\n taskMode,\n providerType: resolvedProviderType,\n nodeId: args.node_id,\n sessionId: args.session_id,\n ...(sessionWasIdle ? {\n dispatchAcknowledgementRisk: true,\n dispatchAcknowledgementRiskReason: 'session_was_idle_at_dispatch',\n dispatchAcknowledgementNote: `Session '${args.session_id}' was idle at dispatch time. If it does not transition to generating, this direct task was not acknowledged. Use mesh_status to verify; if the session remains idle, it may appear as stale direct work — launch a fresh session and retry.`,\n } : {}),\n });\n }\n\n // ── Untargeted local task: use queue pull ─────────────────────────────\n const task = enqueueTask(ctx.mesh.id, args.message, {\n targetNodeId: args.node_id,\n targetSessionId: args.session_id,\n taskMode,\n ...(missionId ? { missionId } : {}),\n });\n\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n\n // Also drain any pending coordinator events so the caller sees them inline\n const pendingEvents = drainPendingMeshCoordinatorEvents(ctx.mesh.id, ctx.localDaemonId);\n\n const result: Record<string, unknown> = {\n success: true,\n source: 'queue',\n nodeId: args.node_id,\n taskId: task.id,\n status: task.status,\n taskMode: task.taskMode,\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n };\n if (pendingEvents.length > 0) {\n result.pendingCoordinatorEvents = pendingEvents;\n }\n return JSON.stringify(result);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'mesh_send_task',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n sessionId: args.session_id,\n });\n return JSON.stringify(failure);\n }\n}\n\nexport async function meshReadChat(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; provider_session_id?: string; tail?: number; compact?: boolean },\n): Promise<string> {\n const node = await findOptionalNodeWithRefresh(ctx, args.node_id);\n if (!node) {\n return JSON.stringify(buildMissingNodeReadChatRecovery(ctx, args), null, 2);\n }\n\n await drainCoordinatorPendingEvents(ctx, { nodeIds: [args.node_id] });\n\n const cached = resolveMeshSessionProviderMetadata(ctx, args.node_id, args.session_id);\n const providerSessionId = typeof args.provider_session_id === 'string' && args.provider_session_id.trim()\n ? args.provider_session_id.trim()\n : cached?.providerSessionId;\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n let result: any;\n try {\n result = await commandForNode(ctx, node, 'read_chat', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n workspace: node.workspace,\n ...(cached?.providerType ? { agentType: cached.providerType, providerType: cached.providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n tailLimit: args.tail ?? 10,\n });\n } catch (e: any) {\n // Local read_chat and non-transport (provider/logic) failures keep the existing\n // throw so genuine errors still surface. The cache fallback covers ONLY a remote\n // P2P transport failure (saturated/unreachable peer): mesh_status already degrades\n // its P2P probe gracefully (collectLiveStatusProbe) — read_chat had no catch and\n // hard-failed at the 30s timeout instead of surfacing the coordinator's cached\n // summary. See buildMeshReadChatCacheFallback.\n if (isLocalNode || !isP2pRelayTransportFailure(e)) throw e;\n return buildMeshReadChatCacheFallback(ctx, args, node, e);\n }\n const payload = annotateRapidReadChatAdvisory(unwrapCommandPayload(result) as Record<string, any>, {\n key: `mesh:${args.node_id}:${args.session_id}`,\n toolName: 'mesh_read_chat',\n completionCallbackExpected: true,\n });\n // Default compact=true to keep coordinator context lean.\n // Pass compact=false explicitly only when full transcript detail is needed for debugging.\n const useCompact = args.compact !== false;\n if (useCompact) {\n const compactPayload = compactChatPayload(payload, {\n nodeId: args.node_id,\n sessionId: args.session_id,\n limit: args.tail ?? 10,\n });\n return JSON.stringify(\n payload.pollingAdvisory ? { ...compactPayload, pollingAdvisory: payload.pollingAdvisory } : compactPayload,\n null,\n 2,\n );\n }\n return JSON.stringify(payload, null, 2);\n}\n\nexport async function meshReadDebug(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; provider_session_id?: string; tail?: number; delivery?: 'daemon_file' | 'inline' },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const cached = resolveMeshSessionProviderMetadata(ctx, args.node_id, args.session_id);\n const providerSessionId = typeof args.provider_session_id === 'string' && args.provider_session_id.trim()\n ? args.provider_session_id.trim()\n : cached?.providerSessionId;\n const delivery = args.delivery === 'inline' ? undefined : 'daemon_file';\n const result = await commandForNode(ctx, node, 'get_chat_debug_bundle', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n workspace: node.workspace,\n ...(cached?.providerType ? { agentType: cached.providerType, providerType: cached.providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n tailLimit: args.tail ?? 40,\n ...(delivery ? { delivery } : {}),\n });\n const payload = unwrapCommandPayload(result);\n return JSON.stringify(payload, null, 2);\n}\n\nexport async function meshLaunchSession(\n ctx: MeshContext,\n args: { node_id: string; type?: string; force?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n const bootstrapBlock = getWorktreeBootstrapLaunchBlock(node, ctx.mesh.policy);\n if (bootstrapBlock) return JSON.stringify(bootstrapBlock, null, 2);\n\n {\n let resolvedProviderType = typeof args.type === 'string' && args.type.trim() ? args.type : '';\n if (!resolvedProviderType) {\n const providerPriority = readProviderPriority(node.policy);\n if (!providerPriority.length) {\n return JSON.stringify({ success: false, error: missingProviderPriorityMessage(args.node_id) });\n }\n\n const failed: string[] = [];\n for (const providerType of providerPriority) {\n const detectedResult = await commandForNode(ctx, node, 'detect_provider', { providerType });\n const detectedPayload = unwrapCommandPayload(detectedResult);\n if (detectedPayload?.success && detectedPayload?.detected) {\n resolvedProviderType = providerType;\n break;\n }\n failed.push(`${providerType}: ${detectedPayload?.error || 'not detected'}`);\n }\n if (!resolvedProviderType) {\n return JSON.stringify({ success: false, error: `No usable provider detected for node '${args.node_id}' from providerPriority: ${failed.join('; ')}` });\n }\n }\n\n const coordinatorNode = resolveCoordinatorNode(ctx);\n const coordinatorDaemonId = resolveCoordinatorDaemonId(ctx);\n const spawnedSessionVisibility = readSpawnedSessionVisibility(ctx.mesh.policy);\n // Worker sessions are coordinator-dispatched; a human shouldn't have to approve\n // each one. Resolve the auto-approve policy (node override → mesh policy → default\n // true) and stamp it into the launch settings envelope so it wins over the global\n // per-provider-type autoApprove config via the settingsOverride merge.\n const delegatedWorkerAutoApprove = resolveDelegatedWorkerAutoApprove(ctx.mesh.policy, node.policy);\n const isLocalNode = isLocalControlPlaneNode(ctx, node);\n if (node.daemonId && !isLocalNode && !coordinatorDaemonId) {\n return JSON.stringify(buildMissingCoordinatorDaemonIdFailure(ctx, node, resolvedProviderType), null, 2);\n }\n\n // MESH-LAUNCH-DUP-GUARD: an enqueue auto-launch (queue task → daemon spawns a worker)\n // races a manual mesh_launch_session for the same node/worktree. Without this guard the\n // manual call unconditionally issues a second launch_cli, leaving an empty duplicate\n // worker session alongside the one doing the work (\"채팅 2개\"). Right before launch, probe\n // live status and, if a non-terminal mesh-owned worker session for THIS mesh+node already\n // exists (idle OR still booting/generating), return it idempotently instead of spawning a\n // duplicate. force=true bypasses the guard for a deliberate additional session. Placed\n // AFTER provider resolution + the coordinator-id fail-closed check so an unlaunchable node\n // never burns a status relay (and the relay-blocked invariant holds).\n if (args.force !== true) {\n try {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n const existing = sessions.find(session =>\n !isTerminalSessionRecord(session)\n && isMeshOwnedDelegateSession(session, ctx.mesh.id, args.node_id));\n if (existing) {\n const existingSessionId = readSessionRecordId(existing);\n if (existingSessionId) {\n const existingProviderType = resolveSessionProviderType(existing) || resolvedProviderType || undefined;\n const existingStatus = typeof existing?.status === 'string' ? existing.status : 'unknown';\n return JSON.stringify({\n success: true,\n duplicate: true,\n launched: false,\n reused: true,\n sessionId: existingSessionId,\n nodeId: args.node_id,\n ...(existingProviderType ? { resolvedProviderType: existingProviderType, providerType: existingProviderType } : {}),\n sessionStatus: existingStatus,\n idle: isIdleSessionRecord(existing),\n reason: 'mesh_launch_session_duplicate_guard',\n warning: `Node '${args.node_id}' already has a live mesh-owned worker session ('${existingSessionId}', status '${existingStatus}'). Returning it instead of launching an empty duplicate (likely an enqueue auto-launch already spawned it).`,\n nextAction: `Use session '${existingSessionId}' for mesh_send_task/mesh_read_chat. If you intentionally need a second concurrent session on this node, retry mesh_launch_session with force=true.`,\n }, null, 2);\n }\n }\n } catch {\n // Status probe failed (transport/timeout). Fail open — proceed to launch rather\n // than blocking a legitimate launch on an unreachable status probe. A duplicate is\n // recoverable (mesh_cleanup_sessions); a blocked launch on a transient probe error\n // is worse for the coordinator flow.\n }\n }\n\n let result: any;\n try {\n result = await commandForNode(ctx, node, 'launch_cli', {\n cliType: resolvedProviderType,\n dir: node.workspace,\n settings: {\n // Worker launch envelope (A5): structured metadata so worker sessions\n // know their role and can route completion events back correctly.\n role: 'worker',\n meshNodeFor: ctx.mesh.id,\n meshNodeId: args.node_id,\n spawnedSessionVisibility,\n // Delegated worker auto-approval (see resolveDelegatedWorkerAutoApprove).\n // Lands in settingsOverride and beats the global per-provider autoApprove.\n autoApprove: delegatedWorkerAutoApprove,\n ...(coordinatorDaemonId ? { meshCoordinatorDaemonId: coordinatorDaemonId } : {}),\n // (3) Stamp the originating coordinator SESSION at launch too, so a worker\n // launched via mesh_launch_session routes its completions back to the exact\n // coordinator session (multi-coordinator). Absent → daemon-level fallback.\n ...(ctx.coordinatorSessionId ? { meshCoordinatorSessionId: ctx.coordinatorSessionId } : {}),\n ...(coordinatorNode?.id ? { meshCoordinatorNodeId: coordinatorNode.id } : {}),\n launchedByCoordinator: true,\n }\n });\n } catch (e: any) {\n return JSON.stringify(recordRecoverableLaunchFailure(ctx, node, resolvedProviderType, e), null, 2);\n }\n const launchPayload = extractLaunchPayload(result);\n if (launchPayload?.success === false || result?.success === false) {\n const launchError = new Error(launchPayload?.error || result?.error || 'launch_cli rejected the session launch');\n return JSON.stringify(recordRecoverableLaunchFailure(ctx, node, resolvedProviderType, launchError), null, 2);\n }\n const runtimeSessionId = typeof launchPayload?.sessionId === 'string'\n ? launchPayload.sessionId\n : typeof launchPayload?.id === 'string'\n ? launchPayload.id\n : typeof launchPayload?.runtimeSessionId === 'string'\n ? launchPayload.runtimeSessionId\n : '';\n const providerSessionId = typeof launchPayload?.providerSessionId === 'string' && launchPayload.providerSessionId.trim()\n ? launchPayload.providerSessionId.trim()\n : undefined;\n if (runtimeSessionId) {\n meshSessionProviderMetadata.set(meshSessionCacheKey(args.node_id, runtimeSessionId), {\n providerType: resolvedProviderType,\n ...(providerSessionId ? { providerSessionId } : {}),\n expiresAt: Date.now() + SESSION_PROVIDER_METADATA_TTL_MS,\n });\n }\n // Record session launch in ledger\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'session_launched',\n nodeId: args.node_id,\n sessionId: runtimeSessionId || undefined,\n providerType: resolvedProviderType,\n payload: { providerSessionId },\n });\n } catch { /* ledger append is best-effort */ }\n\n // Tell daemon to trigger queue processing so the new session immediately picks up pending tasks.\n // Surface the trigger result so coordinators can distinguish \"session launched\"\n // from \"queued work actually claimed by that session\".\n const queueTrigger = await triggerMeshQueueAndReport(ctx);\n\n return JSON.stringify({\n ...launchPayload,\n resolvedProviderType,\n ...(providerSessionId ? { providerSessionId } : {}),\n queueTrigger,\n ...buildQueueTriggerGuidance(queueTrigger),\n }, null, 2);\n }\n}\n\nexport async function meshApprove(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; action: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id); // membership check\n\n const cached = getSessionMetadata(meshSessionCacheKey(args.node_id, args.session_id));\n const providerSessionId = cached?.providerSessionId;\n const result = await commandForNode(ctx, node, 'resolve_action', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n workspace: node.workspace,\n ...(cached?.providerType ? { agentType: cached.providerType, providerType: cached.providerType } : {}),\n ...(providerSessionId ? { providerSessionId } : {}),\n action: args.action === 'reject' ? 'reject' : 'approve',\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshCleanupSessions(\n ctx: MeshContext,\n args: { node_id: string; mode: string; session_ids?: string[]; dry_run?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const result = await commandForNode(ctx, node, 'cleanup_mesh_sessions', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n mode: args.mode,\n sessionIds: args.session_ids,\n dryRun: args.dry_run === true,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n","// Mesh tool implementations — git domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n IpcTransport,\n appendLedgerEntry,\n buildCoordinatorP2pRelayFailure,\n buildRemoveNodeArgs,\n collectRelatedRepoStatuses,\n commandForNode,\n extractCloneNodePayload,\n extractGitDiff,\n extractGitStatus,\n extractSubmodules,\n findNodeWithRefresh,\n isP2pTransportUnavailableError,\n refreshMeshFromDaemon,\n syncCoordinatorDaemonMeshCache,\n unwrapCommandPayload,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\nexport async function meshGitStatus(\n ctx: MeshContext,\n args: { node_id: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n // Determine submodule options from node policy\n const autoDiscoverSubmodules = (node.policy as any)?.autoDiscoverSubmodules !== false;\n const submoduleIgnorePaths = (node.policy as any)?.submoduleIgnorePaths || [];\n\n try {\n const statusResult = await commandForNode(ctx, node, 'git_status', {\n workspace: node.workspace,\n refreshUpstream: true,\n includeSubmodules: autoDiscoverSubmodules,\n submoduleIgnorePaths: submoduleIgnorePaths.length > 0 ? submoduleIgnorePaths : undefined,\n });\n const diffResult = await commandForNode(ctx, node, 'git_diff_summary', {\n workspace: node.workspace,\n });\n return JSON.stringify({\n nodeId: args.node_id,\n workspace: node.workspace,\n status: extractGitStatus(statusResult),\n diff: extractGitDiff(diffResult),\n submodules: autoDiscoverSubmodules ? extractSubmodules(statusResult, submoduleIgnorePaths) : undefined,\n relatedRepos: await collectRelatedRepoStatuses(ctx, node),\n }, null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'git_status',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify({\n ...failure,\n workspace: node.workspace,\n }, null, 2);\n }\n}\n\nexport async function meshReadNodeLogs(\n ctx: MeshContext,\n args: { node_id: string; grep?: string; since_ms?: number; tail_bytes?: number; date?: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n try {\n const result = await commandForNode(ctx, node, 'get_mesh_node_logs', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n ...(typeof args.grep === 'string' && args.grep.trim() ? { grep: args.grep.trim() } : {}),\n ...(Number.isFinite(args.since_ms) ? { sinceMs: args.since_ms } : {}),\n ...(Number.isFinite(args.tail_bytes) ? { tailBytes: args.tail_bytes } : {}),\n ...(typeof args.date === 'string' && args.date.trim() ? { date: args.date.trim() } : {}),\n });\n const payload = unwrapCommandPayload(result);\n return JSON.stringify(payload, null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'get_mesh_node_logs',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify(failure, null, 2);\n }\n}\n\nexport async function meshFastForwardNode(\n ctx: MeshContext,\n args: { node_id: string; mode?: 'merge' | 'push'; branch?: string; execute?: boolean; dry_run?: boolean; update_submodules?: boolean; push_submodules?: boolean },\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const node = await findNodeWithRefresh(ctx, args.node_id);\n const submoduleIgnorePaths = (node.policy as any)?.submoduleIgnorePaths || [];\n\n if (node.policy?.readOnly) {\n return JSON.stringify({\n success: false,\n code: 'node_read_only',\n nodeId: args.node_id,\n workspace: node.workspace,\n allowed: false,\n willRun: false,\n executed: false,\n blockingReasons: ['node_read_only'],\n }, null, 2);\n }\n\n try {\n const dryRun = args.dry_run === true || args.execute !== true;\n const result = await commandForNode(ctx, node, 'fast_forward_mesh_node', {\n meshId: ctx.mesh.id,\n nodeId: node.id,\n workspace: node.workspace,\n mode: args.mode === 'push' ? 'push' : 'merge',\n branch: typeof args.branch === 'string' ? args.branch : undefined,\n execute: args.execute === true && args.dry_run !== true,\n dryRun,\n updateSubmodules: args.update_submodules === true,\n pushSubmodules: args.push_submodules === true,\n submoduleIgnorePaths: submoduleIgnorePaths.length > 0 ? submoduleIgnorePaths : undefined,\n });\n return JSON.stringify(unwrapCommandPayload(result), null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'fast_forward_mesh_node',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify({\n ...failure,\n workspace: node.workspace,\n allowed: false,\n willRun: false,\n executed: false,\n blockingReasons: [failure.code || 'mesh_fast_forward_unavailable'],\n }, null, 2);\n }\n}\n\nexport async function meshRestartDaemon(\n ctx: MeshContext,\n args: { node_id: string; channel?: 'stable' | 'preview' },\n): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n try {\n // inlineMesh lets the owning daemon resolve this node for the\n // remote-forward guard; channel is forwarded only when explicitly set so\n // an unset call keeps the daemon on its configured channel.\n const result = await commandForNode(ctx, node, 'restart_daemon_node', {\n meshId: ctx.mesh.id,\n nodeId: node.id,\n inlineMesh: ctx.mesh,\n ...(args.channel ? { channel: args.channel } : {}),\n });\n return JSON.stringify(unwrapCommandPayload(result), null, 2);\n } catch (e: any) {\n const failure = buildCoordinatorP2pRelayFailure(e, {\n command: 'restart_daemon_node',\n targetDaemonId: node.daemonId,\n nodeId: args.node_id,\n });\n return JSON.stringify(failure, null, 2);\n }\n}\n\nexport async function meshCheckpoint(\n ctx: MeshContext,\n args: { node_id: string; message: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n // Policy checks\n if (node.policy?.readOnly) {\n return JSON.stringify({ error: `Node '${args.node_id}' is read-only — cannot checkpoint` });\n }\n\n const result = await commandForNode(ctx, node, 'git_checkpoint', {\n workspace: node.workspace,\n message: args.message,\n includeUntracked: true,\n });\n\n // Record checkpoint in ledger\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'checkpoint_created',\n nodeId: args.node_id,\n payload: {\n message: args.message,\n commit: (result as any)?.checkpoint?.commit,\n outcome: (result as any)?.checkpoint?.status || ((result as any)?.checkpoint?.noop ? 'skipped' : undefined),\n noop: (result as any)?.checkpoint?.noop === true,\n reason: (result as any)?.checkpoint?.reason,\n },\n });\n } catch { /* ledger append is best-effort */ }\n\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshCloneNode(\n ctx: MeshContext,\n args: { source_node_id: string; branch: string; base_branch?: string },\n): Promise<string> {\n const sourceNode = await findNodeWithRefresh(ctx, args.source_node_id);\n\n const result = await commandForNode(ctx, sourceNode, 'clone_mesh_node', {\n meshId: ctx.mesh.id,\n sourceNodeId: args.source_node_id,\n branch: args.branch,\n baseBranch: args.base_branch,\n inlineMesh: ctx.mesh,\n });\n const clonePayload = extractCloneNodePayload(result);\n if (clonePayload?.success && clonePayload.node?.id) {\n const existingIndex = ctx.mesh.nodes.findIndex(n => n.id === clonePayload.node.id);\n if (existingIndex >= 0) ctx.mesh.nodes[existingIndex] = clonePayload.node;\n else ctx.mesh.nodes.push(clonePayload.node);\n ctx.mesh.updatedAt = new Date().toISOString();\n await syncCoordinatorDaemonMeshCache(ctx);\n }\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRemoveNode(\n ctx: MeshContext,\n args: { node_id: string; session_cleanup_mode?: string; force?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const removeArgs = buildRemoveNodeArgs(ctx, args.node_id, args.session_cleanup_mode, args.force === true);\n let result: any;\n let transportFallback: Record<string, unknown> | undefined;\n try {\n result = await commandForNode(ctx, node, 'remove_mesh_node', removeArgs);\n } catch (e: any) {\n if (ctx.transport instanceof IpcTransport && (node as any).isLocalWorktree && isP2pTransportUnavailableError(e)) {\n result = await ctx.transport.command('remove_mesh_node', removeArgs);\n transportFallback = {\n from: 'p2p_mesh_relay',\n to: 'local_control_plane',\n reason: e?.message || String(e),\n };\n } else {\n return JSON.stringify({\n success: false,\n code: isP2pTransportUnavailableError(e) ? 'p2p_unavailable' : 'mesh_remove_node_failed',\n error: e?.message || String(e),\n recoveryHint: isP2pTransportUnavailableError(e)\n ? 'If this is an ADHDev-managed local worktree, retry from a coordinator connected to the daemon that owns the worktree; dashboard command/data-plane traffic still requires P2P.'\n : 'Inspect mesh_status and retry after resolving the reported failure.',\n }, null, 2);\n }\n }\n if (result?.success && result.removed !== false) {\n const idx = ctx.mesh.nodes.findIndex(n => n.id === args.node_id);\n if (idx >= 0) {\n ctx.mesh.nodes.splice(idx, 1);\n ctx.mesh.updatedAt = new Date().toISOString();\n }\n }\n return JSON.stringify({ ...(result || {}), ...(transportFallback ? { transportFallback } : {}) }, null, 2);\n}\n","// Mesh tool implementations — refine domain.\n// Pure move out of mesh-tools.ts (no behavior change). Shared helpers, types, module\n// state and dependency re-exports live in ./mesh-tools-internal.ts; mesh-tools.ts is a barrel.\n\nimport {\n commandForNode,\n findNodeWithRefresh,\n refreshMeshFromDaemon,\n resolveRefineConfigNode,\n unwrapCommandPayload,\n} from './mesh-tools-internal.js';\nimport type {\n MeshContext,\n} from './mesh-tools-internal.js';\n\nexport async function meshRefineConfigSchema(ctx: MeshContext): Promise<string> {\n const node = resolveRefineConfigNode(ctx);\n const result = await commandForNode(ctx, node, 'get_mesh_refine_config_schema', {});\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshValidateRefineConfig(\n ctx: MeshContext,\n args: { node_id?: string; config?: Record<string, unknown> },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'validate_mesh_refine_config', {\n workspace: node.workspace,\n inlineMesh: ctx.mesh,\n ...(args.config ? { config: args.config } : {}),\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshSuggestRefineConfig(\n ctx: MeshContext,\n args: { node_id?: string },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'suggest_mesh_refine_config', {\n workspace: node.workspace,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshChangeImpactConfigSchema(ctx: MeshContext): Promise<string> {\n const node = resolveRefineConfigNode(ctx);\n const result = await commandForNode(ctx, node, 'get_mesh_change_impact_config_schema', {});\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshValidateChangeImpactConfig(\n ctx: MeshContext,\n args: { node_id?: string; config?: Record<string, unknown> },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'validate_mesh_change_impact_config', {\n workspace: node.workspace,\n ...(args.config ? { config: args.config } : {}),\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshSuggestChangeImpactConfig(\n ctx: MeshContext,\n args: { node_id?: string },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'suggest_mesh_change_impact_config', {\n workspace: node.workspace,\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshInit(\n ctx: MeshContext,\n args: { node_id?: string; write?: boolean; overwrite?: boolean },\n): Promise<string> {\n const node = resolveRefineConfigNode(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'mesh_init', {\n workspace: node.workspace,\n inlineMesh: ctx.mesh,\n ...(args.write !== undefined ? { write: args.write } : {}),\n ...(args.overwrite !== undefined ? { overwrite: args.overwrite } : {}),\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRefinePlan(\n ctx: MeshContext,\n args: { node_id: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n const result = await commandForNode(ctx, node, 'plan_mesh_refine_node', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n inlineMesh: ctx.mesh,\n });\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRefineNode(\n ctx: MeshContext,\n args: { node_id: string; execute?: boolean; dry_run?: boolean },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n const result = await commandForNode(ctx, node, 'refine_mesh_node', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n ...(args.execute !== undefined ? { execute: args.execute } : {}),\n ...(args.dry_run !== undefined ? { dryRun: args.dry_run } : {}),\n inlineMesh: ctx.mesh,\n });\n if (result?.success && result.async !== true && result.removeResult?.removed !== false) {\n const idx = ctx.mesh.nodes.findIndex(n => n.id === args.node_id);\n if (idx >= 0) {\n ctx.mesh.nodes.splice(idx, 1);\n ctx.mesh.updatedAt = new Date().toISOString();\n }\n }\n return JSON.stringify(result, null, 2);\n}\n\nexport async function meshRefineBatch(\n ctx: MeshContext,\n args: { node_ids?: string[]; execute?: boolean; dry_run?: boolean } = {},\n): Promise<string> {\n // Refresh so auto-collection and explicit node IDs resolve against the latest\n // mesh membership (siblings may have been created/removed in this MCP session).\n await refreshMeshFromDaemon(ctx);\n const nodeIds = Array.isArray(args.node_ids)\n ? args.node_ids.filter((v): v is string => typeof v === 'string' && v.trim().length > 0).map(v => v.trim())\n : undefined;\n\n // The batch orchestrator runs on the coordinator daemon that owns the source repo\n // and worktrees. Drive it through the local control-plane transport (the same\n // daemon that hosts these worktree nodes), passing inlineMesh so inline-cache-only\n // clone nodes resolve.\n const result = await ctx.transport.command('batch_refine_mesh_nodes', {\n meshId: ctx.mesh.id,\n ...(nodeIds ? { nodeIds } : {}),\n ...(args.execute !== undefined ? { execute: args.execute } : {}),\n ...(args.dry_run !== undefined ? { dryRun: args.dry_run } : {}),\n inlineMesh: ctx.mesh,\n });\n\n // On a successful synchronous execute, prune merged/skipped nodes from the local\n // mesh snapshot so subsequent tool calls don't re-target already-converged worktrees.\n // The execute path is now async (async:true / status:'accepted') — per-node results\n // arrive later via terminal refine events, so there is nothing to prune yet. Only the\n // legacy/synchronous batch result (with inline `results`) is pruned here.\n const payload = unwrapCommandPayload(result) ?? result;\n if (payload?.batch && payload?.dryRun === false && payload?.async !== true && Array.isArray(payload?.results)) {\n for (const outcome of payload.results) {\n if (outcome?.convergence === 'merged_to_main' || outcome?.convergence === 'skipped_patch_equivalent') {\n const idx = ctx.mesh.nodes.findIndex(n => n.id === outcome.nodeId);\n if (idx >= 0) ctx.mesh.nodes.splice(idx, 1);\n }\n }\n ctx.mesh.updatedAt = new Date().toISOString();\n }\n return JSON.stringify(result, null, 2);\n}\n","import { ALL_MESH_TOOLS } from './tools/mesh-tools.js';\n\nconst STANDARD_TOOLS = [\n 'list_daemons',\n 'list_sessions',\n 'launch_session',\n 'stop_session',\n 'check_pending',\n 'read_chat',\n 'read_chat_debug',\n 'send_chat',\n 'approve',\n 'git_status',\n 'git_log',\n 'git_diff',\n 'git_checkpoint',\n 'git_push',\n 'screenshot',\n];\n\nexport function buildMcpHelpText(): string {\n const meshTools = ALL_MESH_TOOLS.map(tool => tool.name);\n return `\nADHDev MCP Server\n\nUsage:\n adhdev mcp Local mode (requires standalone daemon)\n adhdev mcp --mode ipc --repo-mesh <mesh_id> Cloud daemon IPC mesh mode\n adhdev-mcp --help Compatibility bin (same server, legacy package entrypoint)\n\nOptions:\n --mode <mode> Transport: local or ipc\n --port <n> Standalone or IPC daemon port (defaults: local 3847, ipc 19222)\n --password <pass> Standalone daemon password (if set)\n --repo-mesh <mesh_id> Enable mesh mode — exposes only mesh-scoped coordinator tools\n --help Show this help\n\nEnvironment variables:\n ADHDEV_PASSWORD Daemon password (local mode)\n ADHDEV_MESH_ID Mesh ID (mesh mode)\n ADHDEV_MCP_TRANSPORT Transport: local or ipc\n\nStandard tools: ${STANDARD_TOOLS.join(', ')}\nMesh tools: ${meshTools.join(', ')}\n`.trim();\n}\n","/**\n * ADHDev MCP Server\n *\n * Exposes IDE agent sessions as MCP tools via stdio transport.\n * Two modes:\n * local — talks to standalone daemon at localhost:3847\n * ipc — talks to cloud daemon local IPC at localhost:19222\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport os from 'node:os';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { LocalTransport } from './transports/local.js';\nimport { IpcTransport } from './transports/ipc.js';\nimport type { CommandTransport } from './transports/mode.js';\n\nimport { LIST_SESSIONS_TOOL, listSessions } from './tools/list-sessions.js';\nimport { LIST_DAEMONS_TOOL, listDaemons } from './tools/list-daemons.js';\nimport { READ_CHAT_TOOL, readChat } from './tools/read-chat.js';\nimport { READ_CHAT_DEBUG_TOOL, readChatDebug } from './tools/read-chat-debug.js';\nimport { SPEC_DEBUG_TOOL, specDebug } from './tools/spec-debug.js';\nimport { SEND_CHAT_TOOL, sendChat } from './tools/send-chat.js';\nimport { APPROVE_TOOL, approve } from './tools/approve.js';\nimport { SCREENSHOT_TOOL, screenshot } from './tools/screenshot.js';\nimport { GIT_STATUS_TOOL, gitStatus } from './tools/git-status.js';\nimport { GIT_LOG_TOOL, gitLog } from './tools/git-log.js';\nimport { GIT_DIFF_TOOL, gitDiff } from './tools/git-diff.js';\nimport { GIT_CHECKPOINT_TOOL, gitCheckpoint } from './tools/git-checkpoint.js';\nimport { GIT_PUSH_TOOL, gitPush } from './tools/git-push.js';\nimport { LAUNCH_SESSION_TOOL, launchSession } from './tools/launch-session.js';\nimport { STOP_SESSION_TOOL, stopSession } from './tools/stop-session.js';\nimport { CHECK_PENDING_TOOL, checkPending } from './tools/check-pending.js';\nimport {\n ALL_MESH_TOOLS, meshStatus, meshListNodes, meshSendTask, meshReadChat,\n meshEnqueueTask, meshViewQueue, meshQueueCancel, meshQueueRequeue,\n meshReadDebug,\n meshLaunchSession, meshGitStatus, meshReadNodeLogs, meshFastForwardNode, meshRestartDaemon, meshCheckpoint, meshApprove,\n meshCloneNode, meshRemoveNode, meshRefineNode,\n meshRefineConfigSchema, meshValidateRefineConfig, meshSuggestRefineConfig, meshInit, meshRefinePlan, meshRefineBatch,\n meshChangeImpactConfigSchema, meshValidateChangeImpactConfig, meshSuggestChangeImpactConfig,\n meshCleanupSessions, meshPruneStaleDirect, meshTaskHistory, meshRecordNote, meshReconcileLedger, meshMissionUpsert,\n meshMissionList, meshReviewInbox\n} from './tools/mesh-tools.js';\nimport type { MeshContext } from './tools/mesh-tools.js';\n\nexport interface AdhdevMcpServerOptions {\n mode: 'local' | 'ipc';\n // local options\n port?: number;\n password?: string;\n // mesh mode (optional — restricts tools to mesh-scoped set)\n meshId?: string;\n}\n\nexport async function buildMeshModeCoordinatorPrompt(mesh: any): Promise<string> {\n try {\n const { buildCoordinatorSystemPrompt } = await import('@adhdev/daemon-core');\n return buildCoordinatorSystemPrompt({ mesh });\n } catch (e: any) {\n throw new Error(`Failed to build Repo Mesh coordinator prompt: ${e?.message ?? String(e)}`);\n }\n}\n\nexport async function startMcpServer(opts: AdhdevMcpServerOptions): Promise<void> {\n const transport: CommandTransport =\n opts.mode === 'ipc'\n ? new IpcTransport({ port: opts.port })\n : new LocalTransport({ port: opts.port, password: opts.password });\n\n // Verify connectivity before registering tools\n const alive = await transport.ping();\n if (!alive) {\n const hint =\n opts.mode === 'local'\n ? `Make sure the standalone daemon is running (adhdev standalone or npx @adhdev/daemon-standalone).`\n : `Make sure the cloud daemon is running with local IPC enabled (adhdev daemon).`;\n process.stderr.write(`[adhdev-mcp] Cannot reach ${opts.mode} daemon. ${hint}\\n`);\n process.exit(1);\n }\n\n const isLocal = opts.mode === 'local';\n\n // ── Mesh Mode ─────────────────────────────────\n if (opts.meshId) {\n let mesh: any;\n\n // Priority 1: ADHDEV_INLINE_MESH env var (set by daemon in .mcp.json for cloud meshes)\n if (!mesh && process.env.ADHDEV_INLINE_MESH) {\n try {\n mesh = JSON.parse(process.env.ADHDEV_INLINE_MESH);\n process.stderr.write(`[adhdev-mcp] Loaded mesh config from ADHDEV_INLINE_MESH env\\n`);\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Failed to parse ADHDEV_INLINE_MESH: ${e.message}\\n`);\n }\n }\n\n // Priority 2: Local ~/.adhdev/meshes.json\n if (!mesh) {\n try {\n const { getMesh } = await import('@adhdev/daemon-core');\n mesh = getMesh(opts.meshId);\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Local meshes.json lookup failed: ${e.message}\\n`);\n }\n }\n\n // Fallback: query the running daemon (supports cloud-originating meshes\n // launched via inlineMesh that don't exist in local meshes.json)\n if (!mesh && (transport instanceof LocalTransport || transport instanceof IpcTransport)) {\n try {\n const result = await transport.command('get_mesh', { meshId: opts.meshId });\n if (result?.success && result.mesh) {\n mesh = result.mesh;\n process.stderr.write(`[adhdev-mcp] Loaded mesh config from daemon\\n`);\n }\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Daemon mesh query failed: ${e.message}\\n`);\n }\n }\n\n if (!mesh) {\n process.stderr.write(`[adhdev-mcp] Mesh '${opts.meshId}' not found in local config. Use 'adhdev mesh list' to see available meshes.\\n`);\n process.exit(1);\n }\n\n let localDaemonId: string | undefined;\n let localMachineId: string | undefined;\n let coordinatorHostname: string | undefined = os.hostname();\n\n if (transport instanceof LocalTransport || transport instanceof IpcTransport) {\n try {\n const { loadConfig } = await import('@adhdev/daemon-core');\n const cfg = loadConfig();\n if (cfg.machineId) localMachineId = cfg.machineId;\n else if (cfg.registeredMachineId) localMachineId = cfg.registeredMachineId;\n } catch { /* best-effort */ }\n }\n\n if (transport instanceof IpcTransport) {\n try {\n const statusResult = await transport.getStatus();\n const instanceId = typeof statusResult?.status?.instanceId === 'string' ? statusResult.status.instanceId.trim() : '';\n const hostname = typeof statusResult?.status?.hostname === 'string'\n ? statusResult.status.hostname.trim()\n : typeof statusResult?.status?.machine?.hostname === 'string'\n ? statusResult.status.machine.hostname.trim()\n : '';\n if (instanceId) localDaemonId = instanceId;\n if (hostname) coordinatorHostname = hostname;\n } catch { /* best-effort metadata for remote completion forwarding */ }\n }\n\n // (3) Session-anchored routing: the daemon injects this coordinator CLI session's own\n // runtime id via ADHDEV_COORDINATOR_SESSION_ID at launch. Carrying it on MeshContext lets\n // every dispatch stamp the originating coordinator session so the worker's completion\n // routes back to the right session (multi-coordinator). Absent → daemon-level fallback.\n const coordinatorSessionId = typeof process.env.ADHDEV_COORDINATOR_SESSION_ID === 'string' && process.env.ADHDEV_COORDINATOR_SESSION_ID.trim()\n ? process.env.ADHDEV_COORDINATOR_SESSION_ID.trim()\n : undefined;\n\n const meshCtx: MeshContext = { mesh, transport, ...(localDaemonId ? { localDaemonId } : {}), ...(localMachineId ? { localMachineId } : {}), ...(coordinatorHostname ? { coordinatorHostname } : {}), ...(coordinatorSessionId ? { coordinatorSessionId } : {}) };\n\n const coordinatorPrompt = await buildMeshModeCoordinatorPrompt(mesh);\n\n const server = new Server(\n { name: 'adhdev-mcp-server', version: '0.9.82' },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n // Expose coordinator prompt as MCP resource\n const { ListResourcesRequestSchema, ReadResourceRequestSchema } = await import('@modelcontextprotocol/sdk/types.js');\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [{\n uri: 'coordinator://system-prompt',\n name: 'Coordinator System Prompt',\n description: `System prompt for mesh \"${mesh.name}\" coordinator`,\n mimeType: 'text/plain',\n }],\n }));\n server.setRequestHandler(ReadResourceRequestSchema, async (req) => {\n if (req.params.uri === 'coordinator://system-prompt') {\n return { contents: [{ uri: req.params.uri, mimeType: 'text/plain', text: coordinatorPrompt }] };\n }\n throw new Error(`Unknown resource: ${req.params.uri}`);\n });\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: ALL_MESH_TOOLS }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const { name, arguments: args } = req.params;\n const a = (args ?? {}) as Record<string, any>;\n try {\n let text: string;\n switch (name) {\n case 'mesh_status': text = await meshStatus(meshCtx, a as any); break;\n case 'mesh_list_nodes': text = await meshListNodes(meshCtx); break;\n case 'mesh_enqueue_task': text = await meshEnqueueTask(meshCtx, a as any); break;\n case 'mesh_view_queue': text = await meshViewQueue(meshCtx, a as any); break;\n case 'mesh_queue_cancel': text = await meshQueueCancel(meshCtx, a as any); break;\n case 'mesh_queue_requeue': text = await meshQueueRequeue(meshCtx, a as any); break;\n case 'mesh_send_task': text = await meshSendTask(meshCtx, a as any); break;\n case 'mesh_read_chat': text = await meshReadChat(meshCtx, a as any); break;\n case 'mesh_read_debug': text = await meshReadDebug(meshCtx, a as any); break;\n case 'mesh_launch_session': text = await meshLaunchSession(meshCtx, a as any); break;\n case 'mesh_git_status': text = await meshGitStatus(meshCtx, a as any); break;\n case 'mesh_read_node_logs': text = await meshReadNodeLogs(meshCtx, a as any); break;\n case 'mesh_fast_forward_node': text = await meshFastForwardNode(meshCtx, a as any); break;\n case 'mesh_restart_daemon': text = await meshRestartDaemon(meshCtx, a as any); break;\n case 'mesh_checkpoint': text = await meshCheckpoint(meshCtx, a as any); break;\n case 'mesh_approve': text = await meshApprove(meshCtx, a as any); break;\n case 'mesh_clone_node': text = await meshCloneNode(meshCtx, a as any); break;\n case 'mesh_remove_node': text = await meshRemoveNode(meshCtx, a as any); break;\n case 'mesh_refine_node': text = await meshRefineNode(meshCtx, a as any); break;\n case 'mesh_refine_batch': text = await meshRefineBatch(meshCtx, a as any); break;\n case 'mesh_refine_config_schema': text = await meshRefineConfigSchema(meshCtx); break;\n case 'mesh_validate_refine_config': text = await meshValidateRefineConfig(meshCtx, a as any); break;\n case 'mesh_suggest_refine_config': text = await meshSuggestRefineConfig(meshCtx, a as any); break;\n case 'mesh_change_impact_config_schema': text = await meshChangeImpactConfigSchema(meshCtx); break;\n case 'mesh_validate_change_impact_config': text = await meshValidateChangeImpactConfig(meshCtx, a as any); break;\n case 'mesh_suggest_change_impact_config': text = await meshSuggestChangeImpactConfig(meshCtx, a as any); break;\n case 'mesh_init': text = await meshInit(meshCtx, a as any); break;\n case 'mesh_refine_plan': text = await meshRefinePlan(meshCtx, a as any); break;\n case 'mesh_cleanup_sessions': text = await meshCleanupSessions(meshCtx, a as any); break;\n case 'mesh_prune_stale_direct': text = await meshPruneStaleDirect(meshCtx, a as any); break;\n case 'mesh_task_history': text = await meshTaskHistory(meshCtx, a as any); break;\n case 'mesh_record_note': text = await meshRecordNote(meshCtx, a as any); break;\n case 'mesh_reconcile_ledger': text = await meshReconcileLedger(meshCtx, a as any); break;\n case 'mesh_mission_upsert': text = await meshMissionUpsert(meshCtx, a as any); break;\n case 'mesh_mission_list': text = await meshMissionList(meshCtx, a as any); break;\n case 'mesh_review_inbox': text = await meshReviewInbox(meshCtx, a as any); break;\n default: return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };\n }\n return { content: [{ type: 'text', text }] };\n } catch (err: any) {\n return { content: [{ type: 'text', text: `Error: ${err?.message ?? String(err)}` }], isError: true };\n }\n });\n\n const stdioTransport = new StdioServerTransport();\n await server.connect(stdioTransport);\n process.stderr.write(`[adhdev-mcp] Server running in ${opts.mode} mesh mode — mesh: ${mesh.name} (${mesh.repoIdentity})\\n`);\n return;\n }\n\n // ── Standard Mode ──────────────────────────────\n\n // Tool availability by mode:\n // both: list_sessions, launch_session, read_chat, send_chat, approve, git_status\n // local: + screenshot (requires P2P / local daemon access)\n const allTools = [\n LIST_DAEMONS_TOOL,\n LIST_SESSIONS_TOOL,\n LAUNCH_SESSION_TOOL,\n STOP_SESSION_TOOL,\n CHECK_PENDING_TOOL,\n READ_CHAT_TOOL,\n READ_CHAT_DEBUG_TOOL,\n SPEC_DEBUG_TOOL,\n SEND_CHAT_TOOL,\n APPROVE_TOOL,\n GIT_STATUS_TOOL,\n GIT_LOG_TOOL,\n GIT_DIFF_TOOL,\n GIT_CHECKPOINT_TOOL,\n GIT_PUSH_TOOL,\n ...(isLocal ? [SCREENSHOT_TOOL] : []),\n ];\n\n const server = new Server(\n { name: 'adhdev-mcp-server', version: '0.9.66' },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: allTools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const { name, arguments: args } = req.params;\n const a = (args ?? {}) as Record<string, any>;\n\n try {\n switch (name) {\n case 'list_daemons': {\n const text = await listDaemons(transport, { format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'list_sessions': {\n const text = await listSessions(transport, { format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'read_chat': {\n const text = await readChat(transport, a);\n return { content: [{ type: 'text', text }] };\n }\n case 'read_chat_debug': {\n const text = await readChatDebug(transport, a as any);\n return { content: [{ type: 'text', text }] };\n }\n case 'spec_debug': {\n const text = await specDebug(transport, a as any);\n return { content: [{ type: 'text', text }] };\n }\n case 'send_chat': {\n const text = await sendChat(transport, { message: a.message, session_id: a.session_id });\n return { content: [{ type: 'text', text }] };\n }\n case 'approve': {\n const action = a.action === 'reject' ? 'reject' : 'approve';\n const text = await approve(transport, { action, session_id: a.session_id });\n return { content: [{ type: 'text', text }] };\n }\n case 'screenshot': {\n const result = await screenshot(transport, { session_id: a.session_id });\n if (result.type === 'image') {\n return {\n content: [{ type: 'image', data: result.data, mimeType: result.mimeType }],\n };\n }\n return { content: [{ type: 'text', text: result.text }] };\n }\n case 'git_status': {\n const text = await gitStatus(transport, { workspace: a.workspace, include_diff: a.include_diff, format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_log': {\n const text = await gitLog(transport, { workspace: a.workspace, limit: a.limit, file: a.file, since: a.since, until: a.until, format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_diff': {\n const text = await gitDiff(transport, { workspace: a.workspace, file: a.file, max_lines: a.max_lines, staged: a.staged, format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_checkpoint': {\n const text = await gitCheckpoint(transport, { workspace: a.workspace, message: a.message, include_untracked: a.include_untracked });\n return { content: [{ type: 'text', text }] };\n }\n case 'git_push': {\n const text = await gitPush(transport, { workspace: a.workspace, remote: a.remote, branch: a.branch });\n return { content: [{ type: 'text', text }] };\n }\n case 'launch_session': {\n const text = await launchSession(transport, {\n type: a.type,\n workspace: a.workspace,\n model: a.model,\n });\n return { content: [{ type: 'text', text }] };\n }\n case 'stop_session': {\n const text = await stopSession(transport, {\n session_id: a.session_id,\n type: a.type,\n });\n return { content: [{ type: 'text', text }] };\n }\n case 'check_pending': {\n const text = await checkPending(transport, { format: a.format });\n return { content: [{ type: 'text', text }] };\n }\n default:\n return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };\n }\n } catch (err: any) {\n return {\n content: [{ type: 'text', text: `Error: ${err?.message ?? String(err)}` }],\n isError: true,\n };\n }\n });\n\n const stdioTransport = new StdioServerTransport();\n await server.connect(stdioTransport);\n process.stderr.write(`[adhdev-mcp] Server running in ${opts.mode} mode.\\n`);\n}\n","/**\n * LocalTransport — HTTP client for standalone daemon at localhost:3847\n */\n\nconst DEFAULT_PORT = 3847;\n\nexport interface LocalTransportOptions {\n port?: number;\n password?: string;\n}\n\nexport class LocalTransport {\n private baseUrl: string;\n private authHeader: string | null;\n\n constructor(opts: LocalTransportOptions = {}) {\n this.baseUrl = `http://localhost:${opts.port ?? DEFAULT_PORT}`;\n this.authHeader = opts.password ? `Bearer ${opts.password}` : null;\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.authHeader) h['Authorization'] = this.authHeader;\n return h;\n }\n\n async getStatus(): Promise<any> {\n const res = await fetch(`${this.baseUrl}/api/v1/status`, { headers: this.headers() });\n if (!res.ok) throw new Error(`Status fetch failed: ${res.status}`);\n return res.json();\n }\n\n async command(type: string, args: Record<string, unknown> = {}): Promise<any> {\n const res = await fetch(`${this.baseUrl}/api/v1/command`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ type, ...args }),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => res.statusText);\n throw new Error(`Command ${type} failed: ${res.status} ${text}`);\n }\n return res.json();\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.getStatus();\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const FORMAT_PROP = {\n format: {\n type: 'string' as const,\n enum: ['text', 'json'],\n description: \"Output format: 'text' (default, human-readable) or 'json' (structured, for programmatic use).\",\n },\n};\n\nexport const LIST_SESSIONS_TOOL = {\n name: 'list_sessions',\n description: 'List all connected agent sessions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listSessions(\n transport: CommandTransport,\n args: { format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n // Single daemon, status endpoint has full SessionEntry[]\n const status = await transport.getStatus();\n const sessions: any[] = status?.sessions ?? [];\n\n if (asJson) {\n return JSON.stringify({\n sessions: sessions.map((s: any) => ({\n id: s.id,\n type: s.providerType ?? s.type ?? 'unknown',\n label: s.label ?? null,\n status: s.status ?? s.agentStatus ?? null,\n workspace: s.workspace ?? null,\n })),\n }, null, 2);\n }\n\n if (sessions.length === 0) return 'No active sessions.';\n const lines = sessions.map((s: any) => {\n const parts = [`id: ${s.id}`, `type: ${s.providerType ?? s.type ?? 'unknown'}`];\n if (s.label) parts.push(`label: ${s.label}`);\n if (s.status ?? s.agentStatus) parts.push(`status: ${s.status ?? s.agentStatus}`);\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n return parts.join(', ');\n });\n return `Sessions (${sessions.length}):\\n${lines.join('\\n')}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const LIST_DAEMONS_TOOL = {\n name: 'list_daemons',\n description:\n 'List the connected daemon (machine running the ADHDev agent). ' +\n 'Returns the daemon identity extracted from its status report.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listDaemons(\n transport: CommandTransport,\n args: { format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n // Single daemon — extract identity from status\n const status = await transport.getStatus();\n const daemon = {\n id: status?.id ?? status?.instanceId ?? 'standalone',\n hostname: status?.hostname ?? status?.machine?.hostname ?? 'localhost',\n platform: status?.platform ?? status?.machine?.platform ?? 'unknown',\n version: status?.version ?? null,\n sessions: (status?.sessions ?? []).length,\n };\n if (asJson) return JSON.stringify({ daemons: [daemon] }, null, 2);\n return `Daemons (1):\\n id: ${daemon.id}, hostname: ${daemon.hostname}, platform: ${daemon.platform}${daemon.version ? `, version: ${daemon.version}` : ''}, sessions: ${daemon.sessions}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { compactChatPayload, messageContent } from './chat-compact.js';\nimport { annotateRapidReadChatAdvisory, type RapidReadChatAdvisory } from './read-chat-polling-advisory.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const READ_CHAT_TOOL = {\n name: 'read_chat',\n description: 'Read the current chat conversation from an IDE agent session. Returns recent messages.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions). Pass explicitly in local mode when more than one session exists; omitting requires an active target and may fail.',\n },\n limit: {\n type: 'number',\n description: 'Max messages to return (default: 50).',\n },\n compact: {\n type: 'boolean',\n description: 'Opt-in compact mode: filters tool/terminal/system/internal/control/debug/status chatter and returns user-visible messages plus lightweight summary metadata.',\n },\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function readChat(\n transport: CommandTransport,\n args: { session_id?: string; limit?: number; format?: 'text' | 'json'; compact?: boolean },\n): Promise<string> {\n const limit = args.limit ?? 50;\n\n const result = await transport.command('read_chat', {\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n tailLimit: limit,\n });\n const annotated = annotateRapidReadChatAdvisory(result as Record<string, any>, {\n key: `local:${args.session_id ?? '__active__'}`,\n toolName: 'read_chat',\n completionCallbackExpected: false,\n });\n return formatChatResult(annotated, args.session_id, args.format, limit, args.compact);\n}\n\nfunction formatChatResult(result: any, sessionId?: string, format?: 'text' | 'json', limit = 50, compact = false): string {\n if (!result?.success && result?.error) {\n if (format === 'json') return JSON.stringify({ error: result.error, messages: [] }, null, 2);\n return `Error: ${result.error}`;\n }\n\n const messages: any[] = result?.messages ?? result?.data?.messages ?? [];\n const source = { ...result, messages };\n const compactPayload = compact ? compactChatPayload(source, { sessionId: sessionId ?? null, limit }) : null;\n const outputMessages = compact ? compactPayload.messages : messages;\n\n if (format === 'json') {\n if (compact && compactPayload) {\n return JSON.stringify({\n session_id: sessionId ?? null,\n ...compactPayload,\n ...(result?.pollingAdvisory ? { pollingAdvisory: result.pollingAdvisory as RapidReadChatAdvisory } : {}),\n messages: compactPayload.messages.map((m: any) => ({\n role: m.role,\n kind: m.kind ?? null,\n content: messageContent(m),\n timestamp: m.timestamp ?? null,\n // Preserve the dedup flag so consumers know the body lives in `summary`.\n ...(m._sameAsSummary === true ? { _sameAsSummary: true } : {}),\n })),\n }, null, 2);\n }\n return JSON.stringify({\n session_id: sessionId ?? null,\n ...(result?.pollingAdvisory ? { pollingAdvisory: result.pollingAdvisory as RapidReadChatAdvisory } : {}),\n messages: outputMessages.slice(-limit).map((m: any) => ({\n role: m.role,\n kind: m.kind ?? null,\n content: messageContent(m),\n timestamp: m.timestamp ?? null,\n })),\n }, null, 2);\n }\n\n if ((format === 'text' || format === undefined) && compact && compactPayload) {\n const summaryText = typeof compactPayload.summary === 'string' ? compactPayload.summary.trim() : '';\n const tail = outputMessages.slice(-limit);\n const lastIndex = tail.length - 1;\n const lines = tail.flatMap((m: any, idx: number) => {\n const role = m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Agent' : m.role;\n const content = messageContent(m);\n if (idx === lastIndex && (role === 'Agent' || m.role === 'agent') && summaryText && content.trim() === summaryText) {\n return [];\n }\n const truncated = content.length > 500 ? `${content.slice(0, 500)}…` : content;\n return [`[${role}] ${truncated}`];\n });\n if (compactPayload.summary) {\n const truncatedSummary = compactPayload.summary.length > 500\n ? `${compactPayload.summary.slice(0, 500)}…`\n : compactPayload.summary;\n lines.push(`[Summary] ${truncatedSummary}`);\n }\n if (result?.pollingAdvisory) {\n lines.push(`Advisory: ${(result.pollingAdvisory as RapidReadChatAdvisory).message}`);\n }\n return lines.length > 0 ? lines.join('\\n\\n') : 'No messages in chat.';\n }\n\n if (outputMessages.length === 0) {\n return result?.pollingAdvisory\n ? `No messages in chat.\\n\\nAdvisory: ${(result.pollingAdvisory as RapidReadChatAdvisory).message}`\n : 'No messages in chat.';\n }\n const lines = outputMessages.slice(-limit).map((m: any) => {\n const role = m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Agent' : m.role;\n const content = messageContent(m);\n const truncated = content.length > 500 ? `${content.slice(0, 500)}…` : content;\n return `[${role}] ${truncated}`;\n });\n if (result?.pollingAdvisory) {\n lines.push(`Advisory: ${(result.pollingAdvisory as RapidReadChatAdvisory).message}`);\n }\n return lines.join('\\n\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const READ_CHAT_DEBUG_TOOL = {\n name: 'read_chat_debug',\n description: 'Collect a daemon-side chat/parser debug bundle for an agent session without opening the browser UI. Prefer this when terminal/chat diverge or long CLI transcripts parse incorrectly. Defaults to daemon_file delivery and returns a saved bundle locator.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions). Required for reliable routing.',\n },\n agent_type: {\n type: 'string',\n description: 'Optional provider/agent type hint, e.g. hermes-cli, claude-cli, codex-cli.',\n },\n limit: {\n type: 'number',\n description: 'Max read_chat tail messages embedded in the bundle (default: 40).',\n },\n delivery: {\n type: 'string',\n enum: ['daemon_file', 'inline'],\n description: 'daemon_file saves the full sanitized bundle on the daemon and returns a locator; inline returns the sanitized bundle in the MCP response. Default: daemon_file.',\n },\n ...FORMAT_PROP,\n },\n required: ['session_id'],\n },\n};\n\nexport async function readChatDebug(\n transport: CommandTransport,\n args: {\n session_id?: string;\n agent_type?: string;\n limit?: number;\n delivery?: 'daemon_file' | 'inline';\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';\n if (!sessionId) throw new Error('session_id is required');\n\n const tailLimit = args.limit ?? 40;\n const delivery = args.delivery === 'inline' ? 'inline' : 'daemon_file';\n const commandArgs = {\n targetSessionId: sessionId,\n tailLimit,\n ...(args.agent_type ? { agentType: args.agent_type, providerType: args.agent_type } : {}),\n ...(delivery === 'daemon_file' ? { delivery: 'daemon_file' } : {}),\n };\n\n const result = await transport.command('get_chat_debug_bundle', commandArgs);\n\n return formatChatDebugResult(result, { sessionId, delivery, format: args.format });\n}\n\nexport function formatChatDebugResult(\n result: any,\n options: { sessionId: string; delivery: 'daemon_file' | 'inline'; format?: 'text' | 'json' },\n): string {\n if (!result?.success && result?.error) {\n if (options.format === 'json') return JSON.stringify({ success: false, error: result.error }, null, 2);\n return `Error: ${result.error}`;\n }\n\n if (options.format === 'json') {\n return JSON.stringify(result, null, 2);\n }\n\n if (result?.delivery === 'daemon_file') {\n const summary = result.summary && typeof result.summary === 'object' ? result.summary : {};\n return [\n 'ADHDev chat debug bundle saved on daemon.',\n `session_id: ${options.sessionId}`,\n `bundle_id: ${String(result.bundleId || '')}`,\n `saved_path: ${String(result.savedPath || '')}`,\n `size_bytes: ${String(result.sizeBytes || '')}`,\n `created_at: ${String(result.createdAt || '')}`,\n `read_chat_status: ${String((summary as any).readChatStatus || '')}`,\n `read_chat_total_messages: ${String((summary as any).readChatTotalMessages ?? '')}`,\n `cli_status: ${String((summary as any).cliStatus || '')}`,\n `cli_message_count: ${String((summary as any).cliMessageCount ?? '')}`,\n ].join('\\n');\n }\n\n if (typeof result?.text === 'string') return result.text;\n if (result?.bundle) return JSON.stringify(result.bundle, null, 2);\n return JSON.stringify(result, null, 2);\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const SPEC_DEBUG_TOOL = {\n name: 'spec_debug',\n description: 'Get current spec state, sections, and state transition history for a spec-driven CLI session (claude-cli, antigravity-cli, etc.). Use to diagnose idle/busy detection issues, inspect section parsing, or verify idle_hold and busy_hold behavior.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions).',\n },\n ...FORMAT_PROP,\n },\n required: ['session_id'],\n },\n};\n\nexport async function specDebug(\n transport: CommandTransport,\n args: {\n session_id?: string;\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';\n if (!sessionId) throw new Error('session_id is required');\n\n const result = await transport.command('get_spec_debug', { targetSessionId: sessionId });\n\n return formatSpecDebugResult(result, { sessionId, format: args.format });\n}\n\nexport function formatSpecDebugResult(\n result: any,\n options: { sessionId: string; format?: 'text' | 'json' },\n): string {\n if (!result?.success) {\n const err = result?.error || 'Unknown error';\n if (options.format === 'json') return JSON.stringify({ success: false, error: err }, null, 2);\n return `Error: ${err}`;\n }\n\n if (options.format === 'json') return JSON.stringify(result, null, 2);\n\n const snap = result.snapshot;\n if (!snap) {\n return [\n `session_id: ${options.sessionId}`,\n `provider_type: ${String(result.providerType || '')}`,\n 'is_spec_provider: false',\n 'No spec debug data available (not a spec-driven provider).',\n ].join('\\n');\n }\n\n const lines: string[] = [];\n lines.push(`session_id: ${options.sessionId}`);\n lines.push(`provider_type: ${String(result.providerType || snap.cliType || '')}`);\n lines.push(`spec_id: ${String(snap.spec_id || '')}`);\n lines.push(`spec_path: ${String(snap.specPath || '')}`);\n lines.push(`current_state: ${snap.current_state ? `${snap.current_state.id} (${snap.current_state.label})` : 'none'}`);\n lines.push(`idle_hold_pending: ${String(snap.idleHoldPending ?? false)}`);\n lines.push(`last_busy_at: ${snap.lastBusyAt ? new Date(snap.lastBusyAt).toISOString() : 'never'}`);\n lines.push(`exited: ${String(snap.exited ?? false)}`);\n\n if (snap.current_modal) {\n lines.push(`current_modal: ${JSON.stringify(snap.current_modal)}`);\n }\n\n // Sections — full raw text (this is a debugging surface; do NOT truncate or\n // collapse newlines, so the exact text the FSM regexes match against is\n // visible). Each section is fenced and prefixed with its line count.\n if (snap.sections && typeof snap.sections === 'object') {\n lines.push('');\n lines.push('## Sections');\n for (const [id, text] of Object.entries(snap.sections as Record<string, string>)) {\n const raw = String(text ?? '');\n const lineCount = raw.length === 0 ? 0 : raw.split('\\n').length;\n lines.push('');\n lines.push(`### section: ${id} (${lineCount} lines, ${raw.length} chars)`);\n lines.push('```');\n lines.push(raw);\n lines.push('```');\n }\n }\n\n // State history (most recent first) — now includes the fired transition\n // (`via`) and the per-condition rule evaluation (`matchedRules`), so you can\n // see WHICH regex/time-gate fired and, for regex rules, the matched text.\n const history = Array.isArray(snap.stateHistory) ? snap.stateHistory : [];\n if (history.length > 0) {\n lines.push('');\n lines.push('## State History (newest first)');\n const now = Date.now();\n for (const entry of [...history].reverse().slice(0, 20)) {\n const agoMs = now - entry.at;\n const ago = agoMs < 2000 ? `${agoMs}ms ago` : `${(agoMs / 1000).toFixed(1)}s ago`;\n const dur = entry.durationMs > 0 ? ` held ${entry.durationMs}ms` : '';\n const via = entry.via ? ` via ${entry.via}` : '';\n lines.push(` ${String(entry.stateId).padEnd(18)} ${ago}${dur}${via}`);\n const rules = Array.isArray(entry.matchedRules) ? entry.matchedRules : [];\n for (const rule of rules) {\n lines.push(` ${String(rule)}`);\n }\n }\n }\n\n // PTY event timeline (input we injected / output the PTY printed / resize /\n // cursor moves) — correlate by timestamp with the State History above to see\n // what input/output preceded each status transition.\n const timeline = Array.isArray(snap.eventTimeline) ? snap.eventTimeline : [];\n if (timeline.length > 0) {\n lines.push('');\n lines.push('## Event Timeline (oldest first)');\n const now = Date.now();\n const arrow: Record<string, string> = {\n input: '→ in ', output: '← out', resize: '⇲ size', cursor: '⌖ cur', spawn: '⏻ spawn', exit: '⏹ exit',\n };\n for (const ev of timeline.slice(-120)) {\n const agoMs = now - (ev.ts ?? now);\n const ago = agoMs < 2000 ? `${agoMs}ms` : `${(agoMs / 1000).toFixed(1)}s`;\n const tag = arrow[String(ev.kind)] ?? String(ev.kind);\n const bytes = typeof ev.bytes === 'number' ? ` [${ev.bytes}b]` : '';\n lines.push(` -${ago.padStart(6)} ${tag}${bytes} ${String(ev.content ?? '')}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const SEND_CHAT_TOOL = {\n name: 'send_chat',\n description: 'Send a message to an IDE agent session.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n message: {\n type: 'string',\n description: 'The message to send to the agent.',\n },\n session_id: {\n type: 'string',\n description: 'Target session ID (from list_sessions). Omit to use the active session.',\n },\n },\n required: ['message'],\n },\n};\n\nexport async function sendChat(\n transport: CommandTransport,\n args: { message: string; session_id?: string },\n): Promise<string> {\n if (!args.message?.trim()) throw new Error('message is required');\n\n const result = await transport.command('send_chat', {\n message: args.message,\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n if (result?.success === false) return `Error: ${result.error ?? 'send_chat failed'}`;\n return 'Message sent.';\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const APPROVE_TOOL = {\n name: 'approve',\n description: 'Approve or reject a pending agent action (e.g. file write, command execution).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n action: {\n type: 'string',\n enum: ['approve', 'reject'],\n description: 'Whether to approve or reject the pending action.',\n },\n session_id: {\n type: 'string',\n description: 'Target session ID. Omit to use the active session.',\n },\n },\n required: ['action'],\n },\n};\n\nexport async function approve(\n transport: CommandTransport,\n args: { action: 'approve' | 'reject'; session_id?: string },\n): Promise<string> {\n const action = args.action === 'reject' ? 'reject' : 'approve';\n\n const result = await transport.command('resolve_action', {\n action,\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n if (result?.success === false) return `Error: ${result.error ?? 'resolve_action failed'}`;\n return `Action ${action}d.`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const SCREENSHOT_TOOL = {\n name: 'screenshot',\n description:\n 'Capture a screenshot of the current IDE window. Returns the image.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID. Omit to use the active session.',\n },\n },\n required: [],\n },\n};\n\nexport async function screenshot(\n transport: CommandTransport,\n args: { session_id?: string },\n): Promise<{ type: 'image'; data: string; mimeType: string } | { type: 'text'; text: string }> {\n const result: any = await transport.command('screenshot', {\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n\n if (result?.success === false) {\n return { type: 'text', text: `Error: ${result.error ?? 'screenshot failed'}` };\n }\n\n const b64: string | undefined = result?.base64 ?? result?.screenshot ?? result?.result;\n if (!b64) {\n return { type: 'text', text: 'Screenshot captured but no image data returned.' };\n }\n\n const mimeType = result?.format === 'png' ? 'image/png' : 'image/webp';\n return { type: 'image', data: b64, mimeType };\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const GIT_STATUS_TOOL = {\n name: 'git_status',\n description: 'Get git repository status for a workspace on the daemon machine.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n include_diff: {\n type: 'boolean',\n description: 'Include changed file list (default: true).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitStatus(\n transport: CommandTransport,\n args: { workspace: string; include_diff?: boolean; format?: 'text' | 'json' },\n): Promise<string> {\n let diffSummary: any;\n\n const statusResult = await transport.command('git_status', {\n workspace: args.workspace,\n });\n const status: any = statusResult?.status ?? statusResult;\n\n if (args.include_diff !== false) {\n const diffResult = await transport.command('git_diff_summary', {\n workspace: args.workspace,\n });\n diffSummary = diffResult?.diffSummary ?? diffResult;\n }\n\n if (status?.success === false || status?.reason) {\n const msg = status?.error ?? status?.reason ?? 'unknown';\n if (args.format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git error: ${msg}`;\n }\n if (!status?.isGitRepo) {\n if (args.format === 'json') return JSON.stringify({ error: `Not a git repository: ${args.workspace}` }, null, 2);\n return `Not a git repository: ${args.workspace}`;\n }\n\n if (args.format === 'json') {\n const files = diffSummary?.files?.map((f: any) => ({\n path: f.path,\n old_path: f.oldPath ?? null,\n status: f.status ?? 'M',\n insertions: f.insertions ?? 0,\n deletions: f.deletions ?? 0,\n })) ?? [];\n return JSON.stringify({\n branch: status.branch ?? null,\n head_commit: status.headCommit ?? null,\n head_message: status.headMessage ?? null,\n ahead: status.ahead ?? 0,\n behind: status.behind ?? 0,\n staged: status.staged ?? 0,\n modified: status.modified ?? 0,\n untracked: status.untracked ?? 0,\n deleted: status.deleted ?? 0,\n stash_count: status.stashCount ?? 0,\n has_conflicts: status.hasConflicts ?? false,\n dirty: status.dirty ?? false,\n changed_files: files,\n total_insertions: diffSummary?.totalInsertions ?? 0,\n total_deletions: diffSummary?.totalDeletions ?? 0,\n }, null, 2);\n }\n\n const lines: string[] = [];\n if (status.branch) lines.push(`Branch: ${status.branch}`);\n if (status.headCommit) {\n lines.push(`HEAD: ${status.headCommit.slice(0, 7)}${status.headMessage ? ` — ${status.headMessage.slice(0, 80)}` : ''}`);\n }\n if (status.ahead > 0) lines.push(`Ahead: ${status.ahead}`);\n if (status.behind > 0) lines.push(`Behind: ${status.behind}`);\n if (status.staged > 0) lines.push(`Staged: ${status.staged}`);\n if (status.modified > 0) lines.push(`Modified: ${status.modified}`);\n if (status.untracked > 0) lines.push(`Untracked: ${status.untracked}`);\n if (status.deleted > 0) lines.push(`Deleted: ${status.deleted}`);\n if (status.stashCount > 0) lines.push(`Stashes: ${status.stashCount}`);\n if (status.hasConflicts) lines.push('Conflicts: YES');\n if (!status.dirty) lines.push('Working tree: clean');\n\n if (diffSummary?.files?.length > 0) {\n lines.push('');\n lines.push(`Changed files (${diffSummary.files.length}):`);\n for (const f of diffSummary.files.slice(0, 20)) {\n lines.push(` ${f.status ?? 'M'} ${f.path}${f.oldPath ? ` (was ${f.oldPath})` : ''}${f.insertions || f.deletions ? ` +${f.insertions ?? 0}/-${f.deletions ?? 0}` : ''}`);\n }\n if (diffSummary.files.length > 20) lines.push(` … and ${diffSummary.files.length - 20} more`);\n if (diffSummary.totalInsertions || diffSummary.totalDeletions) {\n lines.push(`Total: +${diffSummary.totalInsertions ?? 0}/-${diffSummary.totalDeletions ?? 0}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const GIT_LOG_TOOL = {\n name: 'git_log',\n description:\n 'Get commit history for a workspace. Shows hash, message, author, and date for recent commits. ' +\n 'Use this to track what changes an agent has made, verify checkpoint commits, or understand project history.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n limit: {\n type: 'number',\n description: 'Max commits to return (default: 20, max: 100).',\n },\n file: {\n type: 'string',\n description: 'Filter history to commits that touched this repo-relative file path (optional).',\n },\n since: {\n type: 'string',\n description: 'Only commits after this date (ISO 8601 or git date string, optional).',\n },\n until: {\n type: 'string',\n description: 'Only commits before this date (ISO 8601 or git date string, optional).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitLog(\n transport: CommandTransport,\n args: {\n workspace: string;\n limit?: number;\n file?: string;\n since?: string;\n until?: string;\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const limit = Math.max(1, Math.min(100, args.limit ?? 20));\n\n let raw: any = await transport.command('git_log', {\n workspace: args.workspace,\n limit,\n ...(args.file ? { path: args.file } : {}),\n ...(args.since ? { since: args.since } : {}),\n ...(args.until ? { until: args.until } : {}),\n });\n raw = raw?.log ?? raw;\n\n if (raw?.success === false || raw?.reason) {\n const msg = raw?.error ?? raw?.reason ?? 'unknown';\n if (args.format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git log error: ${msg}`;\n }\n\n if (!raw?.isGitRepo) {\n const msg = `Not a git repository: ${args.workspace}`;\n if (args.format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return msg;\n }\n\n const entries: any[] = raw?.entries ?? [];\n\n if (args.format === 'json') {\n return JSON.stringify({\n workspace: raw.workspace,\n branch: raw.branch ?? null,\n entries: entries.map((e) => ({\n commit: e.commit,\n short: e.commit?.slice(0, 7),\n message: e.message,\n author: e.authorName ?? null,\n author_email: e.authorEmail ?? null,\n authored_at: e.authoredAt ? new Date(e.authoredAt).toISOString() : null,\n })),\n total: entries.length,\n truncated: raw.truncated ?? false,\n }, null, 2);\n }\n\n if (entries.length === 0) return 'No commits found.';\n\n const lines = entries.map((e) => {\n const hash = e.commit?.slice(0, 7) ?? '???????';\n const date = e.authoredAt ? new Date(e.authoredAt).toISOString().slice(0, 10) : '';\n const author = e.authorName ? ` (${e.authorName})` : '';\n return `${hash} ${date}${author} ${e.message}`;\n });\n\n const header = `Commits (${entries.length}${raw.truncated ? ', truncated' : ''}):`;\n return `${header}\\n${lines.join('\\n')}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const GIT_DIFF_TOOL = {\n name: 'git_diff',\n description:\n 'Get the actual diff content for changed files in a workspace. ' +\n 'Without a specific file, returns diffs for up to 5 changed files. ' +\n 'Use this to review what an agent actually changed — file names alone (from git_status) are not enough for code review.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n file: {\n type: 'string',\n description: 'Specific repo-relative file path to diff (optional — if omitted, returns top 5 changed files).',\n },\n max_lines: {\n type: 'number',\n description: 'Max diff lines per file before truncating (default: 300).',\n },\n staged: {\n type: 'boolean',\n description: 'Show staged changes instead of unstaged (default: false).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\ninterface FileDiffResult {\n path: string;\n old_path?: string | null;\n status?: string;\n diff: string;\n truncated: boolean;\n binary: boolean;\n error?: string;\n}\n\nexport async function gitDiff(\n transport: CommandTransport,\n args: {\n workspace: string;\n file?: string;\n max_lines?: number;\n staged?: boolean;\n format?: 'text' | 'json';\n },\n): Promise<string> {\n const maxLines = Math.max(10, Math.min(2000, args.max_lines ?? 300));\n const staged = args.staged ?? false;\n\n return localGitDiff(transport, args.workspace, args.file, maxLines, staged, args.format);\n}\n\nasync function localGitDiff(\n transport: CommandTransport,\n workspace: string,\n file: string | undefined,\n maxLines: number,\n staged: boolean,\n format: 'text' | 'json' | undefined,\n): Promise<string> {\n if (file) {\n const raw = await transport.command('git_diff_file', { workspace, path: file, staged });\n const d = raw?.diff ?? raw;\n\n if (d?.success === false || d?.reason) {\n const msg = d?.error ?? d?.reason ?? 'unknown';\n if (format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git diff error: ${msg}`;\n }\n\n const lines = (d?.diff ?? '').split('\\n');\n const truncated = lines.length > maxLines;\n const result = {\n files: [{\n path: file,\n diff: truncated ? lines.slice(0, maxLines).join('\\n') + '\\n... (truncated)' : (d?.diff ?? ''),\n truncated,\n binary: d?.binary ?? false,\n }],\n total_files: 1,\n shown_files: 1,\n truncated,\n };\n return formatDiffResult(result, format);\n }\n\n // No specific file: get summary then fetch top 5\n const summaryRaw = await transport.command('git_diff_summary', { workspace, staged });\n const summary = summaryRaw?.diffSummary ?? summaryRaw;\n\n if (summary?.success === false || summary?.reason) {\n const msg = summary?.error ?? summary?.reason ?? 'unknown';\n if (format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return `Git diff error: ${msg}`;\n }\n\n if (!summary?.isGitRepo) {\n const msg = `Not a git repository: ${workspace}`;\n if (format === 'json') return JSON.stringify({ error: msg }, null, 2);\n return msg;\n }\n\n const files: any[] = summary?.files ?? [];\n if (files.length === 0) {\n if (format === 'json') return JSON.stringify({ files: [], total_files: 0, shown_files: 0, truncated: false }, null, 2);\n return 'No changed files.';\n }\n\n const topFiles = files.slice(0, 5);\n const fileDiffs: FileDiffResult[] = await Promise.all(\n topFiles.map(async (f: any): Promise<FileDiffResult> => {\n try {\n const raw = await transport.command('git_diff_file', { workspace, path: f.path, staged });\n const d = raw?.diff ?? raw;\n const lines = (d?.diff ?? '').split('\\n');\n const trunc = lines.length > maxLines;\n return {\n path: f.path,\n old_path: f.oldPath ?? null,\n status: f.status ?? 'M',\n diff: trunc ? lines.slice(0, maxLines).join('\\n') + '\\n... (truncated)' : (d?.diff ?? ''),\n truncated: trunc,\n binary: d?.binary ?? false,\n };\n } catch {\n return { path: f.path, diff: '', truncated: false, binary: false, error: 'fetch failed' };\n }\n }),\n );\n\n return formatDiffResult({\n files: fileDiffs,\n total_files: files.length,\n shown_files: topFiles.length,\n truncated: files.length > 5,\n }, format);\n}\n\nfunction formatDiffResult(result: any, format: 'text' | 'json' | undefined): string {\n if (format === 'json') return JSON.stringify(result, null, 2);\n\n const files: FileDiffResult[] = result?.files ?? [];\n if (files.length === 0) return 'No changed files.';\n\n const parts: string[] = [];\n const totalShown = result?.shown_files ?? files.length;\n const totalAll = result?.total_files ?? files.length;\n if (totalAll > totalShown) {\n parts.push(`Showing ${totalShown} of ${totalAll} changed files:\\n`);\n }\n\n for (const f of files) {\n const header = `--- ${f.path}${f.old_path ? ` (was ${f.old_path})` : ''} ---`;\n if (f.error) {\n parts.push(`${header}\\n(error: ${f.error})\\n`);\n } else if (f.binary) {\n parts.push(`${header}\\n(binary file)\\n`);\n } else if (!f.diff) {\n parts.push(`${header}\\n(no diff)\\n`);\n } else {\n parts.push(`${header}\\n${f.diff}${f.truncated ? '' : '\\n'}`);\n }\n }\n\n return parts.join('\\n');\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const GIT_CHECKPOINT_TOOL = {\n name: 'git_checkpoint',\n description:\n 'Create a checkpoint commit in a workspace. ' +\n 'Stages all tracked changes (or all files including untracked) and commits with a prefixed message. ' +\n 'Use this to save progress before a risky operation, or to create a restore point the orchestrator can reference.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n message: {\n type: 'string',\n description: 'Checkpoint message (max 200 chars). Will be prefixed with \"adhdev: checkpoint \".',\n },\n include_untracked: {\n type: 'boolean',\n description: 'Also stage and commit untracked files (default: false).',\n },\n },\n required: ['workspace', 'message'],\n },\n};\n\nexport async function gitCheckpoint(\n transport: CommandTransport,\n args: {\n workspace: string;\n message: string;\n include_untracked?: boolean;\n },\n): Promise<string> {\n const message = args.message?.trim();\n if (!message) return 'Error: message is required';\n if (message.length > 200) return 'Error: message must be 200 characters or fewer';\n\n let raw: any = await transport.command('git_checkpoint', {\n workspace: args.workspace,\n message,\n includeUntracked: args.include_untracked ?? false,\n });\n raw = raw?.checkpoint ?? raw;\n\n if (raw?.success === false || raw?.reason) {\n const msg = raw?.error ?? raw?.reason ?? 'unknown';\n if (msg.includes('Nothing to commit') || msg.includes('nothing to commit')) {\n return 'Nothing to commit — working tree is clean.';\n }\n return `Git checkpoint error: ${msg}`;\n }\n\n const commit = raw?.commit?.slice(0, 7) ?? '???????';\n const fullMsg = raw?.message ?? `adhdev: checkpoint ${message}`;\n return `Checkpoint created: ${commit} — ${fullMsg}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const GIT_PUSH_TOOL = {\n name: 'git_push',\n description:\n 'Push a branch to a remote repository on the daemon machine. ' +\n 'If the branch has no upstream configured, sets it automatically. ' +\n 'Key for parallel multi-machine workflows: after git_checkpoint, push each machine\\'s ' +\n 'branch to origin so changes are available for PR/review.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n workspace: {\n type: 'string',\n description: 'Absolute path to the workspace/repository directory.',\n },\n remote: {\n type: 'string',\n description: 'Remote name (default: \"origin\").',\n },\n branch: {\n type: 'string',\n description: 'Branch to push (default: current branch).',\n },\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitPush(\n transport: CommandTransport,\n args: {\n workspace: string;\n remote?: string;\n branch?: string;\n },\n): Promise<string> {\n let raw: any = await transport.command('git_push', {\n workspace: args.workspace,\n remote: args.remote ?? 'origin',\n ...(args.branch ? { branch: args.branch } : {}),\n });\n raw = raw?.push ?? raw;\n\n if (raw?.success === false || raw?.reason) {\n const msg = raw?.error ?? raw?.reason ?? 'unknown';\n return `Git push error: ${msg}`;\n }\n\n const branch = raw?.branch ?? args.branch ?? '(current)';\n const remote = raw?.remote ?? args.remote ?? 'origin';\n const newBranch = raw?.newBranch ? ' [new branch]' : '';\n const output = raw?.output ? `\\n${raw.output}` : '';\n\n return `Pushed ${branch} → ${remote}${newBranch}${output}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const LAUNCH_SESSION_TOOL = {\n name: 'launch_session',\n description:\n 'Launch a new agent session on the daemon. Supports CLI agents (e.g. hermes-cli, claude-cli, gemini-cli), ACP agents (e.g. claude-acp), and IDEs (e.g. cursor, vscode).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n type: {\n type: 'string',\n description:\n 'Provider type to launch. CLI examples: hermes-cli, claude-cli, gemini-cli. ACP examples: claude-acp. IDE examples: cursor, vscode.',\n },\n workspace: {\n type: 'string',\n description: 'Working directory for the session. Defaults to the daemon default workspace.',\n },\n model: {\n type: 'string',\n description: 'Model override for ACP agents (e.g. claude-opus-4-7).',\n },\n },\n required: ['type'],\n },\n};\n\nexport async function launchSession(\n transport: CommandTransport,\n args: { type: string; workspace?: string; model?: string },\n): Promise<string> {\n const isCliOrAcp =\n args.type.includes('-cli') || args.type.includes('-acp') || args.type === 'codex';\n const commandType = isCliOrAcp ? 'launch_cli' : 'launch_ide';\n const payload: Record<string, unknown> = isCliOrAcp\n ? { cliType: args.type, dir: args.workspace ?? '~', ...(args.model ? { model: args.model } : {}) }\n : { ideType: args.type, enableCdp: true };\n const result = await transport.command(commandType, payload);\n if (result?.success === false) return `Error: ${result.error ?? 'launch failed'}`;\n const id = result?.id ?? result?.sessionId;\n return id ? `Session launched. id: ${id}, type: ${args.type}` : `Launched: ${JSON.stringify(result)}`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\n\nexport const STOP_SESSION_TOOL = {\n name: 'stop_session',\n description:\n 'Stop a running agent session. For CLI agents (hermes-cli, claude-cli, etc.) this sends a graceful stop signal. ' +\n 'Use list_sessions to find the session_id.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Session ID to stop (from list_sessions).',\n },\n type: {\n type: 'string',\n description:\n 'Provider type (e.g. hermes-cli, claude-cli). Auto-resolved from session_id if omitted.',\n },\n },\n required: ['session_id'],\n },\n};\n\nexport async function stopSession(\n transport: CommandTransport,\n args: { session_id: string; type?: string },\n): Promise<string> {\n let resolvedType = args.type;\n\n // Auto-resolve type from session status if not provided\n if (!resolvedType) {\n const status = await transport.getStatus();\n const session = (status?.sessions ?? []).find((s: any) => s.id === args.session_id);\n resolvedType = session?.providerType ?? session?.type;\n }\n\n if (!resolvedType) {\n return `Error: could not resolve session type for ${args.session_id}. Pass type= explicitly.`;\n }\n\n const result = await transport.command('stop_cli', {\n targetSessionId: args.session_id,\n cliType: resolvedType,\n });\n if (result?.success === false) return `Error: ${result.error ?? 'stop failed'}`;\n return `Session ${args.session_id} stopped.`;\n}\n","import type { CommandTransport } from '../transports/mode.js';\nimport { FORMAT_PROP } from './list-sessions.js';\n\nexport const CHECK_PENDING_TOOL = {\n name: 'check_pending',\n description:\n 'List all agent sessions currently waiting for user approval (tool-use confirmation). ' +\n 'Returns session ID, daemon ID, workspace, and the approval prompt message when available. ' +\n 'Use approve() with the session_id to approve or reject.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function checkPending(\n transport: CommandTransport,\n args: { format?: 'text' | 'json' },\n): Promise<string> {\n const status = await transport.getStatus();\n const sessions: any[] = status?.sessions ?? [];\n\n const pending = sessions.filter(\n (s) => s.status === 'waiting_approval' || s.agentStatus === 'waiting_approval',\n );\n\n if (args.format === 'json') {\n return JSON.stringify({\n pending: pending.map((s) => ({\n session_id: s.id,\n workspace: s.workspace ?? null,\n type: s.providerType ?? null,\n modal_message: s.activeChat?.activeModal?.message ?? null,\n buttons: s.activeChat?.activeModal?.buttons ?? [],\n })),\n }, null, 2);\n }\n\n if (pending.length === 0) return 'No sessions waiting for approval.';\n const lines = pending.map((s) => {\n const modal = s.activeChat?.activeModal;\n const parts = [`session_id: ${s.id}`];\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n if (s.providerType) parts.push(`type: ${s.providerType}`);\n if (modal?.message) parts.push(`prompt: ${modal.message}`);\n if (modal?.buttons?.length) parts.push(`buttons: ${modal.buttons.join(', ')}`);\n return parts.join('\\n ');\n });\n return `Pending approvals (${pending.length}):\\n\\n${lines.join('\\n\\n')}`;\n}\n"],"mappings":"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","names":["now","import_daemon_core","import_daemon_core","slice","result","lines","os","server","stdioTransport"]}