adhdev 0.9.82-rc.271 → 0.9.82-rc.272

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/tools/mesh-tools.ts","../src/transports/ipc.ts","../src/tools/chat-compact.ts","../src/tools/read-chat-polling-advisory.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 * 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 * 26 tools: mesh_status, mesh_mission_upsert, 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\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 appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n summarizeMeshAsyncRefineJobs,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildMeshNodeCapabilityTags,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n classifyStaleDirectForPrune,\n deleteDirectDispatchesByTaskId,\n describeTaskDependencyState,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n computeMeshMissionStats,\n computeMeshTaskStats,\n getActiveMeshMissionSummaries,\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 resolveDelegatedWorkerAutoApprove,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\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\ntype MeshSessionProviderMetadata = {\n providerType: string;\n providerSessionId?: string;\n};\n\nconst SESSION_PROVIDER_METADATA_TTL_MS = 30 * 60_000;\ntype TimestampedSessionMetadata = MeshSessionProviderMetadata & { expiresAt: number };\nconst meshSessionProviderMetadata = new Map<string, TimestampedSessionMetadata>();\n\nfunction 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\nconst ACTIVE_WORK_POLLING_BACKOFF_MS = 60_000;\n\ninterface MeshPollingGuidance {\n activeGeneratingWork: true;\n generatingCount: number;\n doNotPollBefore: string;\n eventSurface: 'pendingCoordinatorEvents';\n nextRecommendedAction: string;\n message: string;\n}\n\nfunction 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// ─── Helpers ────────────────────────────────────\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction 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\nfunction 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\nfunction findNode(mesh: LocalMeshEntry, nodeId: string): LocalMeshNodeEntry {\n const node = mesh.nodes.find(n => n.id === nodeId);\n if (!node) throw new Error(`Node '${nodeId}' is not a member of mesh '${mesh.name}'`);\n return node;\n}\n\nconst DUPLICATE_DISPATCH_WINDOW_MS = 60_000;\nconst STALE_ASSIGNED_QUEUE_MS = 30 * 60_000;\nconst OLD_HISTORICAL_QUEUE_RECORD_MS = 7 * 24 * 60 * 60_000;\nconst ACTIVE_QUEUE_STATUSES = new Set(['pending', 'assigned']);\nconst HISTORICAL_QUEUE_STATUSES = new Set(['completed', 'failed', 'cancelled']);\ntype QueueViewMode = 'all' | 'active' | 'historical';\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 */\nasync 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\nasync 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\nasync function findNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry> {\n const hit = ctx.mesh.nodes.find(n => n.id === nodeId);\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n const refreshed = ctx.mesh.nodes.find(n => n.id === nodeId);\n if (!refreshed) throw new Error(`Node '${nodeId}' is not a member of mesh '${ctx.mesh.name}'`);\n return refreshed;\n}\n\nasync function findOptionalNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry | null> {\n const hit = ctx.mesh.nodes.find(n => n.id === nodeId);\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n return ctx.mesh.nodes.find(n => n.id === nodeId) ?? null;\n}\n\nfunction 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\nfunction 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\ntype QueueLivenessIndex = {\n nodeIds: Set<string>;\n nodeSessionIds: Map<string, Set<string>>;\n};\n\nfunction 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\nfunction 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\nfunction resolveSessionProviderType(session: any): string {\n return readString(session?.providerType)\n || readString(session?.cliType)\n || readString(session?.agentType)\n || '';\n}\n\nfunction 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 */\nfunction 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\nfunction 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\nfunction 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\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\nfunction 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\nfunction normalizeQueueViewMode(value: unknown): QueueViewMode {\n return value === 'active' || value === 'historical' || value === 'all' ? value : 'all';\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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.\nfunction 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.\nconst COMPACT_MAX_ACTIVE_QUEUE_ROWS = 15;\nconst COMPACT_QUEUE_MESSAGE_CAP = 140;\nconst COMPACT_MAX_ACTIVE_WORK_ROWS = 12;\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.\nfunction 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\nfunction 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: the full per-record `message` /\n// `taskSummary` / `taskTitle` blobs are the dominant payload weight on a busy mesh.\n// Truncate them and cap the array.\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') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else if (k === 'taskSummary') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else if (k === 'taskTitle') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else slim[k] = elideLargeNestedValue(k, v);\n }\n return slim;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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) => readString(candidate?.id) === nodeId || readString(candidate?.nodeId) === 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\nfunction 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\nasync 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\nasync function triggerMeshQueueAndReport(\n ctx: MeshContext,\n node?: LocalMeshNodeEntry,\n opts?: { localNode?: boolean },\n): Promise<Record<string, unknown> | undefined> {\n try {\n let raw: any;\n if (ctx.transport instanceof IpcTransport && node?.daemonId && opts?.localNode === false) {\n raw = await ctx.transport.meshCommand(node.daemonId, 'trigger_mesh_queue', { meshId: ctx.mesh.id });\n } else {\n raw = await ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id });\n }\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\nfunction 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.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\nfunction 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\nfunction 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\nfunction 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 !== meshId) return false;\n return !sessionNodeId || sessionNodeId === nodeId;\n}\n\nfunction 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\nfunction isRelaySafeRemoteDelegateSession(session: any, meshId: string, nodeId: string): boolean {\n return isMeshOwnedDelegateSession(session, meshId, nodeId) && hasRemoteRelayMetadata(session);\n}\n\nfunction chooseDispatchableSession(sessions: any[], providerType: string, meshId: string, nodeId: string): any | undefined {\n const live = sessions.filter(session => !isTerminalSessionRecord(session));\n const matchingProvider = (session: any) => !providerType || session?.providerType === providerType || session?.cliType === providerType;\n const meshSessions = live.filter((session: any) =>\n isRelaySafeRemoteDelegateSession(session, meshId, nodeId)\n );\n return meshSessions.find(session => isIdleSessionRecord(session) && matchingProvider(session))\n || meshSessions.find(matchingProvider)\n || undefined;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction extractCloneNodePayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.node?.id));\n}\n\nfunction extractGitStatus(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.status ?? value?.status ?? payload;\n}\n\nfunction extractGitDiff(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.diffSummary ?? payload?.diff ?? value?.diffSummary ?? value?.diff ?? payload;\n}\n\nfunction 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\nfunction 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// 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// 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.\nfunction 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 // Generic backstop: elide any other oversized nested blob on the node.\n for (const k of Object.keys(next)) {\n if (k === 'git' || k === 'machine' || k === 'branchConvergence' || k === 'staleDaemonBuild' || k === 'sessions') continue;\n next[k] = elideLargeNestedValue(k, next[k]);\n }\n\n return next;\n}\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.\nconst COMPACT_DETAILED_NODES_BYTE_BUDGET = 9000;\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.\nconst COMPACT_NODES_TOTAL_BYTE_BUDGET = 13000;\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.\nfunction 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\nfunction 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.\nfunction 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 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 ...(entry.launchBlockedReason !== undefined ? { launchBlockedReason: entry.launchBlockedReason } : {}),\n ...(bc ? { branchConvergence: bc } : {}),\n ...(entry.sessionSummary ? { sessionSummary: entry.sessionSummary } : {}),\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.\nfunction 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\nfunction extractLaunchPayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.sessionId || payload?.id || payload?.runtimeSessionId));\n}\n\ntype MeshLaunchFailureClassification = {\n code: string;\n reason: string;\n transport: string;\n recoverable: boolean;\n retryRecommended: boolean;\n nextAction: string;\n noFallbackReason?: string;\n};\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\ntype RemoteAgentDispatchResult =\n | { success: true; dispatched: true; sessionId: string; providerType?: string }\n | ({ success: false; error: string } & Record<string, unknown>);\n\nfunction 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 * 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 */\nasync 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 } },\n): Promise<RemoteAgentDispatchResult> {\n const transport = ctx.transport as IpcTransport;\n const daemonId = node.daemonId!;\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 if (!isRelaySafeRemoteDelegateSession(explicitSession, ctx.mesh.id, node.id)) {\n return buildRelayUnsafeRemoteSessionFailure(\n ctx,\n node,\n sessionId,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\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 if (!isRelaySafeRemoteDelegateSession(explicitSession, ctx.mesh.id, node.id)) {\n return buildRelayUnsafeRemoteSessionFailure(\n ctx,\n node,\n sessionId,\n resolvedProviderType || resolveSessionProviderType(explicitSession) || undefined,\n );\n }\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);\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 ...(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 return { success: true, dispatched: true, sessionId: sessionId || resolvedProviderType, 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 if (ctx.localDaemonId && session.runtime?.owner === ctx.localDaemonId) return true;\n if (ctx.localDaemonId && 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 return Boolean(\n (ctx.localMachineId && machineId === ctx.localMachineId)\n || (ctx.localDaemonId && 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 const nodeDaemonId = readNodeDaemonId(node);\n const nodeMachineId = readNodeMachineId(node);\n if (nodeDaemonId && ctx.localDaemonId && nodeDaemonId !== ctx.localDaemonId) return false;\n if (nodeMachineId && ctx.localMachineId && 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 => n.id === clonedFromNodeId || (n as any).nodeId === clonedFromNodeId || (n as any).node_id === clonedFromNodeId);\n}\n\nfunction isLocalControlPlaneNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n return !!getLocalControlPlaneMatchReason(ctx, node);\n}\n\nfunction meshSessionCacheKey(nodeId: string, runtimeSessionId: string): string {\n return `${nodeId}:${runtimeSessionId}`;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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// 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.\nconst 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\nfunction 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.\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nasync 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\nfunction 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\nfunction 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\nfunction readSpawnedSessionVisibility(policy: unknown): 'visible' | 'hidden' {\n return (policy as any)?.spawnedSessionVisibility === 'hidden' ? 'hidden' : 'visible';\n}\n\nfunction missingProviderPriorityMessage(nodeId: string): string {\n return `Node '${nodeId}' has no providerPriority policy; pass type explicitly or configure node.policy.providerPriority`;\n}\n\nfunction 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\nfunction 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\nasync 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 * 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 */\nasync 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\nfunction 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\nasync 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\nfunction readNumeric(value: unknown, fallback = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction 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// 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.\nconst COMPACT_MAX_CONVERGENCE_FOLLOWUPS = 12;\n\nfunction 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\nasync 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\nfunction 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\nfunction 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\nasync 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\nfunction isP2pTransportUnavailableError(error: unknown): boolean {\n return isP2pRelayTransportFailure(error);\n}\n\nfunction buildRemoveNodeArgs(ctx: MeshContext, nodeId: string, sessionCleanupMode?: string): Record<string, unknown> {\n return {\n meshId: ctx.mesh.id,\n nodeId,\n ...(sessionCleanupMode ? { sessionCleanupMode } : {}),\n inlineMesh: ctx.mesh,\n };\n}\n\n// ─── Tool Definitions ───────────────────────────\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 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 },\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_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_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_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.',\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 },\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_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_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_FAST_FORWARD_NODE_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_REFINE_PLAN_TOOL,\n MESH_CLEANUP_SESSIONS_TOOL,\n MESH_PRUNE_STALE_DIRECT_TOOL,\n MESH_TASK_HISTORY_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n MESH_MISSION_UPSERT_TOOL,\n MESH_REVIEW_INBOX_TOOL,\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 // 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 };\n\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 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 // 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 };\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\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 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: activeWorkEvidence.activeWork,\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: active mission summaries — goal + live task aggregates (derived, not stored).\n // M7: each mission also carries time/attempt stats derived from the ledger.\n try {\n const missions = getActiveMeshMissionSummaries(mesh.id);\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 } 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 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 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\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 const activeWorkEvidence = buildMeshActiveWork({\n meshId: ctx.mesh.id,\n queue: getQueue(ctx.mesh.id),\n ledgerEntries,\n directDispatches,\n nodes: liveNodes,\n includeTerminalDirect: includeTerminal,\n });\n\n const candidates = [\n ...activeWorkEvidence.staleDirectWork,\n ...(includeTerminal ? activeWorkEvidence.terminalDirectWork : []),\n ];\n // Only prune store-backed dispatch rows (taskIds present in MeshRuntimeStore). Ledger-only\n // remote entries have no store row to delete and are pure audit history — leave them alone.\n const storeTaskIds = new Set(directDispatches.map(d => d.taskId));\n\n const prunable: typeof candidates = [];\n const preservedUnacknowledged: typeof candidates = [];\n const preservedLedgerOnly: typeof candidates = [];\n const preservedNotOrphan: typeof candidates = [];\n for (const record of candidates) {\n const classification = classifyStaleDirectForPrune(record, { includeTerminal });\n if (classification === 'preserve_unacknowledged') {\n preservedUnacknowledged.push(record);\n continue;\n }\n if (classification === 'preserve_active') {\n preservedNotOrphan.push(record);\n continue;\n }\n // prunable_orphan | prunable_terminal — only delete store-backed rows; ledger-only remote\n // entries have no store row to delete and are pure audit history.\n if (!storeTaskIds.has(record.taskId)) {\n preservedLedgerOnly.push(record);\n continue;\n }\n prunable.push(record);\n }\n\n const summarize = (records: typeof candidates) => 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 let prunedCount = 0;\n if (execute && prunable.length) {\n prunedCount = deleteDirectDispatchesByTaskId(ctx.mesh.id, prunable.map(r => r.taskId));\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'direct_dispatch_pruned',\n payload: {\n source: 'mesh_prune_stale_direct',\n prunedCount,\n taskIds: prunable.map(r => r.taskId),\n reasons: Array.from(new Set(prunable.map(r => r.staleReason || (r.terminal ? 'terminal' : 'unknown')))),\n },\n });\n }\n\n return JSON.stringify({\n success: true,\n mode: execute ? 'execute' : 'dry_run',\n meshId: ctx.mesh.id,\n includeTerminal,\n candidateCount: candidates.length,\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 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 userOverrides: n.userOverrides,\n })),\n }, 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 meshEnqueueTask(\n ctx: MeshContext,\n args: {\n message: string; task_mode?: string; taskMode?: string;\n requiredTags?: string[]; required_tags?: string[];\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 try {\n const task = enqueueTask(ctx.mesh.id, args.message, { taskMode, requiredTags, dependsOn, missionId });\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 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 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 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 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 return JSON.stringify({ success: true, task }, 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 ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).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\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 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 },\n });\n if (result.success) {\n // Record dispatch in ledger so task_history is accurate\n const dispatchedSessionId = args.session_id || result.sessionId;\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 return JSON.stringify({\n ...result,\n nodeId: args.node_id,\n sessionId: result.success ? (args.session_id || result.sessionId) : 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 },\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 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 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 },\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 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 ...(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, node, { localNode: isLocalNode });\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 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 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 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 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 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 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\nexport async function meshRemoveNode(\n ctx: MeshContext,\n args: { node_id: string; session_cleanup_mode?: string },\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);\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\nfunction 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\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 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\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","/**\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;\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};\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\nfunction 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\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 const messages = buildCompactMessageTail(visible, { summary, finalAssistant, limit });\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","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","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, meshFastForwardNode, meshCheckpoint, meshApprove,\n meshCloneNode, meshRemoveNode, meshRefineNode,\n meshRefineConfigSchema, meshValidateRefineConfig, meshSuggestRefineConfig, meshRefinePlan, meshRefineBatch,\n meshCleanupSessions, meshPruneStaleDirect, meshTaskHistory, meshReconcileLedger, meshMissionUpsert,\n 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 const meshCtx: MeshContext = { mesh, transport, ...(localDaemonId ? { localDaemonId } : {}), ...(localMachineId ? { localMachineId } : {}), ...(coordinatorHostname ? { coordinatorHostname } : {}) };\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_fast_forward_node': text = await meshFastForwardNode(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_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_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_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 })),\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\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 preview = String(text || '').replace(/\\n/g, '↵').slice(0, 120);\n lines.push(` ${id}: ${preview}`);\n }\n }\n\n // State history (most recent first)\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 lines.push(` ${String(entry.stateId).padEnd(18)} ${ago}${dur}`);\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","slice","result","lines","os","server","stdioTransport"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/tools/mesh-tools.ts","../src/transports/ipc.ts","../src/tools/chat-compact.ts","../src/tools/read-chat-polling-advisory.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 * 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 * 26 tools: mesh_status, mesh_mission_upsert, 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\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 appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildCompactStaleDirectWorkSummary,\n buildMeshActiveWork,\n buildMeshAsyncRefineJobs,\n summarizeMeshAsyncRefineJobs,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildMeshNodeCapabilityTags,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n classifyStaleDirectForPrune,\n deleteDirectDispatchesByTaskId,\n describeTaskDependencyState,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n computeMeshMissionStats,\n computeMeshTaskStats,\n getActiveMeshMissionSummaries,\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 resolveDelegatedWorkerAutoApprove,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\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\ntype MeshSessionProviderMetadata = {\n providerType: string;\n providerSessionId?: string;\n};\n\nconst SESSION_PROVIDER_METADATA_TTL_MS = 30 * 60_000;\ntype TimestampedSessionMetadata = MeshSessionProviderMetadata & { expiresAt: number };\nconst meshSessionProviderMetadata = new Map<string, TimestampedSessionMetadata>();\n\nfunction 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\nconst ACTIVE_WORK_POLLING_BACKOFF_MS = 60_000;\n\ninterface MeshPollingGuidance {\n activeGeneratingWork: true;\n generatingCount: number;\n doNotPollBefore: string;\n eventSurface: 'pendingCoordinatorEvents';\n nextRecommendedAction: string;\n message: string;\n}\n\nfunction 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// ─── Helpers ────────────────────────────────────\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction 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\nfunction 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\nfunction findNode(mesh: LocalMeshEntry, nodeId: string): LocalMeshNodeEntry {\n const node = mesh.nodes.find(n => n.id === nodeId);\n if (!node) throw new Error(`Node '${nodeId}' is not a member of mesh '${mesh.name}'`);\n return node;\n}\n\nconst DUPLICATE_DISPATCH_WINDOW_MS = 60_000;\nconst STALE_ASSIGNED_QUEUE_MS = 30 * 60_000;\nconst OLD_HISTORICAL_QUEUE_RECORD_MS = 7 * 24 * 60 * 60_000;\nconst ACTIVE_QUEUE_STATUSES = new Set(['pending', 'assigned']);\nconst HISTORICAL_QUEUE_STATUSES = new Set(['completed', 'failed', 'cancelled']);\ntype QueueViewMode = 'all' | 'active' | 'historical';\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 */\nasync 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\nasync 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\nasync function findNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry> {\n const hit = ctx.mesh.nodes.find(n => n.id === nodeId);\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n const refreshed = ctx.mesh.nodes.find(n => n.id === nodeId);\n if (!refreshed) throw new Error(`Node '${nodeId}' is not a member of mesh '${ctx.mesh.name}'`);\n return refreshed;\n}\n\nasync function findOptionalNodeWithRefresh(ctx: MeshContext, nodeId: string): Promise<LocalMeshNodeEntry | null> {\n const hit = ctx.mesh.nodes.find(n => n.id === nodeId);\n if (hit && !hit.isLocalWorktree) return hit;\n\n await refreshMeshFromDaemon(ctx);\n\n return ctx.mesh.nodes.find(n => n.id === nodeId) ?? null;\n}\n\nfunction 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\nfunction 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\ntype QueueLivenessIndex = {\n nodeIds: Set<string>;\n nodeSessionIds: Map<string, Set<string>>;\n};\n\nfunction 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\nfunction 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\nfunction resolveSessionProviderType(session: any): string {\n return readString(session?.providerType)\n || readString(session?.cliType)\n || readString(session?.agentType)\n || '';\n}\n\nfunction 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 */\nfunction 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\nfunction 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\nfunction 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\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\nfunction 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\nfunction normalizeQueueViewMode(value: unknown): QueueViewMode {\n return value === 'active' || value === 'historical' || value === 'all' ? value : 'all';\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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.\nfunction 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.\nconst COMPACT_MAX_ACTIVE_QUEUE_ROWS = 15;\nconst COMPACT_QUEUE_MESSAGE_CAP = 140;\nconst COMPACT_MAX_ACTIVE_WORK_ROWS = 12;\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.\nfunction 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\nfunction 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: the full per-record `message` /\n// `taskSummary` / `taskTitle` blobs are the dominant payload weight on a busy mesh.\n// Truncate them and cap the array.\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') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else if (k === 'taskSummary') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else if (k === 'taskTitle') slim[k] = truncateForCompact(v, COMPACT_QUEUE_MESSAGE_CAP);\n else slim[k] = elideLargeNestedValue(k, v);\n }\n return slim;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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) => readString(candidate?.id) === nodeId || readString(candidate?.nodeId) === 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\nfunction 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\nasync 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\nasync function triggerMeshQueueAndReport(\n ctx: MeshContext,\n node?: LocalMeshNodeEntry,\n opts?: { localNode?: boolean },\n): Promise<Record<string, unknown> | undefined> {\n try {\n let raw: any;\n if (ctx.transport instanceof IpcTransport && node?.daemonId && opts?.localNode === false) {\n raw = await ctx.transport.meshCommand(node.daemonId, 'trigger_mesh_queue', { meshId: ctx.mesh.id });\n } else {\n raw = await ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id });\n }\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\nfunction 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.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\nfunction 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\nfunction 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\nfunction 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 !== meshId) return false;\n return !sessionNodeId || sessionNodeId === nodeId;\n}\n\nfunction 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\nfunction isRelaySafeRemoteDelegateSession(session: any, meshId: string, nodeId: string): boolean {\n return isMeshOwnedDelegateSession(session, meshId, nodeId) && hasRemoteRelayMetadata(session);\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 */\nfunction 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\nfunction 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 return meshSessions.find(session => isIdleSessionRecord(session) && matchingProvider(session))\n || meshSessions.find(matchingProvider)\n || undefined;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction extractCloneNodePayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.node?.id));\n}\n\nfunction extractGitStatus(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.status ?? value?.status ?? payload;\n}\n\nfunction extractGitDiff(value: any): any {\n const payload = unwrapCommandPayload(value);\n return payload?.diffSummary ?? payload?.diff ?? value?.diffSummary ?? value?.diff ?? payload;\n}\n\nfunction 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\nfunction 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// 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// 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.\nfunction 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 // Generic backstop: elide any other oversized nested blob on the node.\n for (const k of Object.keys(next)) {\n if (k === 'git' || k === 'machine' || k === 'branchConvergence' || k === 'staleDaemonBuild' || k === 'sessions') continue;\n next[k] = elideLargeNestedValue(k, next[k]);\n }\n\n return next;\n}\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.\nconst COMPACT_DETAILED_NODES_BYTE_BUDGET = 9000;\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.\nconst COMPACT_NODES_TOTAL_BYTE_BUDGET = 13000;\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.\nfunction 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\nfunction 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.\nfunction 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 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 ...(entry.launchBlockedReason !== undefined ? { launchBlockedReason: entry.launchBlockedReason } : {}),\n ...(bc ? { branchConvergence: bc } : {}),\n ...(entry.sessionSummary ? { sessionSummary: entry.sessionSummary } : {}),\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.\nfunction 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\nfunction extractLaunchPayload(value: any): any {\n return findNestedPayload(value, payload => Boolean(payload?.sessionId || payload?.id || payload?.runtimeSessionId));\n}\n\ntype MeshLaunchFailureClassification = {\n code: string;\n reason: string;\n transport: string;\n recoverable: boolean;\n retryRecommended: boolean;\n nextAction: string;\n noFallbackReason?: string;\n};\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\ntype RemoteAgentDispatchResult =\n | { success: true; dispatched: true; sessionId: string; providerType?: string }\n | ({ success: false; error: string } & Record<string, unknown>);\n\nfunction 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 * 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 */\nasync 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 ...(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 return { success: true, dispatched: true, sessionId: sessionId || resolvedProviderType, 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 if (ctx.localDaemonId && session.runtime?.owner === ctx.localDaemonId) return true;\n if (ctx.localDaemonId && 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 return Boolean(\n (ctx.localMachineId && machineId === ctx.localMachineId)\n || (ctx.localDaemonId && 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 const nodeDaemonId = readNodeDaemonId(node);\n const nodeMachineId = readNodeMachineId(node);\n if (nodeDaemonId && ctx.localDaemonId && nodeDaemonId !== ctx.localDaemonId) return false;\n if (nodeMachineId && ctx.localMachineId && 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 => n.id === clonedFromNodeId || (n as any).nodeId === clonedFromNodeId || (n as any).node_id === clonedFromNodeId);\n}\n\nfunction isLocalControlPlaneNode(ctx: MeshContext, node: LocalMeshNodeEntry): boolean {\n return !!getLocalControlPlaneMatchReason(ctx, node);\n}\n\nfunction meshSessionCacheKey(nodeId: string, runtimeSessionId: string): string {\n return `${nodeId}:${runtimeSessionId}`;\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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// 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.\nconst 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\nfunction 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.\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nasync 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\nfunction 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\nfunction 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\nfunction readSpawnedSessionVisibility(policy: unknown): 'visible' | 'hidden' {\n return (policy as any)?.spawnedSessionVisibility === 'hidden' ? 'hidden' : 'visible';\n}\n\nfunction missingProviderPriorityMessage(nodeId: string): string {\n return `Node '${nodeId}' has no providerPriority policy; pass type explicitly or configure node.policy.providerPriority`;\n}\n\nfunction 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\nfunction 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\nasync 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 * 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 */\nasync 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\nfunction 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\nasync 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\nfunction readNumeric(value: unknown, fallback = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction 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// 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.\nconst COMPACT_MAX_CONVERGENCE_FOLLOWUPS = 12;\n\nfunction 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\nasync 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\nfunction 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\nfunction 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\nasync 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\nfunction isP2pTransportUnavailableError(error: unknown): boolean {\n return isP2pRelayTransportFailure(error);\n}\n\nfunction buildRemoveNodeArgs(ctx: MeshContext, nodeId: string, sessionCleanupMode?: string): Record<string, unknown> {\n return {\n meshId: ctx.mesh.id,\n nodeId,\n ...(sessionCleanupMode ? { sessionCleanupMode } : {}),\n inlineMesh: ctx.mesh,\n };\n}\n\n// ─── Tool Definitions ───────────────────────────\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 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 },\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_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_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_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.',\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 },\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_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_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_FAST_FORWARD_NODE_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_REFINE_PLAN_TOOL,\n MESH_CLEANUP_SESSIONS_TOOL,\n MESH_PRUNE_STALE_DIRECT_TOOL,\n MESH_TASK_HISTORY_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n MESH_MISSION_UPSERT_TOOL,\n MESH_REVIEW_INBOX_TOOL,\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 // 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 };\n\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 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 // 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 };\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\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 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: activeWorkEvidence.activeWork,\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: active mission summaries — goal + live task aggregates (derived, not stored).\n // M7: each mission also carries time/attempt stats derived from the ledger.\n try {\n const missions = getActiveMeshMissionSummaries(mesh.id);\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 } 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 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 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\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 const activeWorkEvidence = buildMeshActiveWork({\n meshId: ctx.mesh.id,\n queue: getQueue(ctx.mesh.id),\n ledgerEntries,\n directDispatches,\n nodes: liveNodes,\n includeTerminalDirect: includeTerminal,\n });\n\n const candidates = [\n ...activeWorkEvidence.staleDirectWork,\n ...(includeTerminal ? activeWorkEvidence.terminalDirectWork : []),\n ];\n // Only prune store-backed dispatch rows (taskIds present in MeshRuntimeStore). Ledger-only\n // remote entries have no store row to delete and are pure audit history — leave them alone.\n const storeTaskIds = new Set(directDispatches.map(d => d.taskId));\n\n const prunable: typeof candidates = [];\n const preservedUnacknowledged: typeof candidates = [];\n const preservedLedgerOnly: typeof candidates = [];\n const preservedNotOrphan: typeof candidates = [];\n for (const record of candidates) {\n const classification = classifyStaleDirectForPrune(record, { includeTerminal });\n if (classification === 'preserve_unacknowledged') {\n preservedUnacknowledged.push(record);\n continue;\n }\n if (classification === 'preserve_active') {\n preservedNotOrphan.push(record);\n continue;\n }\n // prunable_orphan | prunable_terminal — only delete store-backed rows; ledger-only remote\n // entries have no store row to delete and are pure audit history.\n if (!storeTaskIds.has(record.taskId)) {\n preservedLedgerOnly.push(record);\n continue;\n }\n prunable.push(record);\n }\n\n const summarize = (records: typeof candidates) => 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 let prunedCount = 0;\n if (execute && prunable.length) {\n prunedCount = deleteDirectDispatchesByTaskId(ctx.mesh.id, prunable.map(r => r.taskId));\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'direct_dispatch_pruned',\n payload: {\n source: 'mesh_prune_stale_direct',\n prunedCount,\n taskIds: prunable.map(r => r.taskId),\n reasons: Array.from(new Set(prunable.map(r => r.staleReason || (r.terminal ? 'terminal' : 'unknown')))),\n },\n });\n }\n\n return JSON.stringify({\n success: true,\n mode: execute ? 'execute' : 'dry_run',\n meshId: ctx.mesh.id,\n includeTerminal,\n candidateCount: candidates.length,\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 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 userOverrides: n.userOverrides,\n })),\n }, 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 meshEnqueueTask(\n ctx: MeshContext,\n args: {\n message: string; task_mode?: string; taskMode?: string;\n requiredTags?: string[]; required_tags?: string[];\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 try {\n const task = enqueueTask(ctx.mesh.id, args.message, { taskMode, requiredTags, dependsOn, missionId });\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 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 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 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 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 return JSON.stringify({ success: true, task }, 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 ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).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\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 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 },\n });\n if (result.success) {\n // Record dispatch in ledger so task_history is accurate\n const dispatchedSessionId = args.session_id || result.sessionId;\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 return JSON.stringify({\n ...result,\n nodeId: args.node_id,\n sessionId: result.success ? (args.session_id || result.sessionId) : 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 },\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 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 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 },\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 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 ...(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, node, { localNode: isLocalNode });\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 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 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 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 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 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 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\nexport async function meshRemoveNode(\n ctx: MeshContext,\n args: { node_id: string; session_cleanup_mode?: string },\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);\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\nfunction 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\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 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\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","/**\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;\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};\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\nfunction 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\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 const messages = buildCompactMessageTail(visible, { summary, finalAssistant, limit });\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","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","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, meshFastForwardNode, meshCheckpoint, meshApprove,\n meshCloneNode, meshRemoveNode, meshRefineNode,\n meshRefineConfigSchema, meshValidateRefineConfig, meshSuggestRefineConfig, meshRefinePlan, meshRefineBatch,\n meshCleanupSessions, meshPruneStaleDirect, meshTaskHistory, meshReconcileLedger, meshMissionUpsert,\n 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 const meshCtx: MeshContext = { mesh, transport, ...(localDaemonId ? { localDaemonId } : {}), ...(localMachineId ? { localMachineId } : {}), ...(coordinatorHostname ? { coordinatorHostname } : {}) };\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_fast_forward_node': text = await meshFastForwardNode(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_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_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_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 })),\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\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 preview = String(text || '').replace(/\\n/g, '↵').slice(0, 120);\n lines.push(` ${id}: ${preview}`);\n }\n }\n\n // State history (most recent first)\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 lines.push(` ${String(entry.stateId).padEnd(18)} ${ago}${dur}`);\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","slice","result","lines","os","server","stdioTransport"]}