@adhdev/daemon-standalone 0.9.82-rc.96 → 0.9.82-rc.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/vendor/mcp-server/index.js +18 -2
- package/vendor/mcp-server/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/tools/mesh-tools.ts","../src/transports/ipc.ts","../src/transports/mode.ts","../src/tools/chat-compact.ts","../src/tools/read-chat-polling-advisory.ts","../src/help.ts","../src/server.ts","../src/transports/local.ts","../src/transports/cloud.ts","../src/tools/list-sessions.ts","../src/tools/list-daemons.ts","../src/tools/read-chat.ts","../src/tools/read-chat-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 --api-key adk_xxx # cloud mode\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' | 'cloud' | 'ipc';\n port?: number;\n password?: string;\n apiKey?: string;\n baseUrl?: string;\n meshId?: string;\n} {\n const args = argv.slice(2);\n let apiKey: string | undefined;\n let baseUrl: string | undefined;\n let port: number | undefined;\n let password: string | undefined;\n let meshId: string | undefined;\n let explicitMode: 'local' | 'cloud' | 'ipc' | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if ((arg === '--api-key' || arg === '-k') && args[i + 1]) {\n apiKey = args[++i];\n } else if (arg?.startsWith('--api-key=')) {\n apiKey = arg.slice('--api-key='.length);\n } else if (arg === '--base-url' && args[i + 1]) {\n baseUrl = args[++i];\n } else if (arg === '--mode' && args[i + 1]) {\n const value = String(args[++i]).trim();\n if (value === 'local' || value === 'cloud' || value === 'ipc') explicitMode = value;\n } else if (arg?.startsWith('--mode=')) {\n const value = arg.slice('--mode='.length).trim();\n if (value === 'local' || value === 'cloud' || 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 (!apiKey && env.ADHDEV_API_KEY) apiKey = env.ADHDEV_API_KEY;\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 === 'cloud' || value === 'ipc') explicitMode = value;\n }\n\n const mode = explicitMode || (apiKey ? 'cloud' : (meshId && env.ADHDEV_INLINE_MESH ? 'ipc' : 'local'));\n return { mode, port, password, apiKey, baseUrl, 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 * 24 tools: mesh_status, 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 */\n\nimport { randomUUID } from 'node:crypto';\nimport { CloudTransport } from '../transports/cloud.js';\nimport { IpcTransport } from '../transports/ipc.js';\nimport { isLocalTransport } from '../transports/mode.js';\nimport type { McpTransport } from '../transports/mode.js';\nimport { compactChatPayload } from './chat-compact.js';\nimport { annotateRapidReadChatAdvisory } from './read-chat-polling-advisory.js';\nimport type { LocalMeshEntry, LocalMeshNodeEntry, RepoMeshPolicy, RepoMeshRelatedRepo } from '@adhdev/daemon-core';\nimport {\n appendLedgerEntry,\n appendRemoteLedgerEntries,\n buildMeshActiveWork,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n getQueue,\n getLedgerSummary,\n getSessionRecoveryContext,\n isP2pRelayTransportFailure,\n readLedgerEntries,\n readLedgerSlice,\n requeueTask,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\n\nexport interface MeshContext {\n mesh: LocalMeshEntry;\n transport: McpTransport;\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 meshSessionProviderMetadata = new Map<string, MeshSessionProviderMetadata>();\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 },\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 };\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 if (!(ctx.transport instanceof IpcTransport)) return;\n try {\n const result = await (ctx.transport as IpcTransport).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 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\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 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 coordinatorDaemonId = typeof settings?.meshCoordinatorDaemonId === 'string' ? settings.meshCoordinatorDaemonId.trim() : '';\n const sessionNodeId = typeof settings?.meshNodeId === 'string' ? settings.meshNodeId.trim() : '';\n if (sessionMeshId !== meshId || !coordinatorDaemonId) return false;\n return !sessionNodeId || sessionNodeId === nodeId;\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 isMeshOwnedDelegateSession(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 ...(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.`,\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\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 },\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.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 (!isMeshOwnedDelegateSession(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 });\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\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 directLocal = isLocalControlPlaneNode(ctx, node);\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 const locality = sameMachine ? 'same_machine' : (evidence.length > 0 ? 'remote_known' : 'remote_or_unknown');\n const localityReason = sameMachine\n ? (directLocal ? 'matched coordinator daemon or machine id' : '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 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 );\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 if (isDirectLocalNode(ctx, node)) return true;\n\n // Worktree nodes created by the local daemon may be persisted without their\n // own machineId. In that case, preserve locality from the cloned source node\n // rather than incorrectly routing local workspace commands through P2P.\n if (node.isLocalWorktree === true) {\n const sourceNode = findClonedFromNode(ctx, node);\n if (sourceNode && isDirectLocalNode(ctx, sourceNode)) return true;\n }\n\n return false;\n}\n\nfunction meshSessionCacheKey(nodeId: string, runtimeSessionId: string): string {\n return `${nodeId}:${runtimeSessionId}`;\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 return countUncommittedChanges(status) > 0;\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 = !isLocalTransport(ctx.transport) && node.daemonId\n ? await (ctx.transport as CloudTransport).gitStatus(node.daemonId, repo.workspace, false, true)\n : 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 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\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\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\nfunction summarizeBranchConvergence(nodes: any[]): Record<string, unknown> {\n const followUps = nodes\n .filter(node => node?.branchConvergence?.needsConvergence === true)\n .map(node => ({\n nodeId: node.nodeId,\n workspace: node.workspace,\n branch: node.branchConvergence.branch,\n status: node.branchConvergence.status,\n reason: node.branchConvergence.reason,\n nextStep: node.branchConvergence.nextStep,\n }));\n\n return {\n needsFollowUp: followUps.length > 0,\n unresolvedCount: followUps.length,\n requiredFinalStates: ['merged_to_main', 'pushed_feature_branch_needs_merge', 'blocked_review', 'cleanup_candidate', 'not_mergeable'],\n followUps,\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 if (isLocalTransport(ctx.transport)) {\n return ctx.transport.command(command, args);\n }\n const identity = buildNodeMachineIdentity(ctx, node);\n throw new Error(`Command '${command}' requires daemon IPC/local transport for node '${node.id}' (hostname=${identity.hostname || 'unknown'}, coordinatorHostname=${identity.coordinatorHostname || 'unknown'}, sameMachine=${identity.sameMachine})`);\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\n try {\n surfacedEvents.push(\n ...normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', { meshId: ctx.mesh.id }) as any)\n .filter(matchesCurrentMesh),\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', { meshId: ctx.mesh.id }),\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 }\n } catch {\n // Non-fatal: remote pending-event recovery is best-effort.\n }\n }\n\n try {\n surfacedEvents.push(\n ...normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', { meshId: ctx.mesh.id }) as any)\n .filter(matchesCurrentMesh),\n );\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n return surfacedEvents;\n }\n\n if (isLocalTransport(ctx.transport)) {\n return (drainPendingMeshCoordinatorEvents(ctx.mesh.id) as any[]).filter(matchesCurrentMesh);\n }\n\n return [];\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.',\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_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 },\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.',\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 },\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.',\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 },\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 },\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. Defaults to dry-run; execution requires execute=true. Never pushes, rebases, resets, cleans, or checks out arbitrary revisions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\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 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: 'When true, if the root fast-forward changes gitlinks, run only git submodule update --init --recursive and verify submodules clean.' },\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_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).' },\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 },\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_REFINE_NODE_TOOL = {\n name: 'mesh_refine_node',\n description: 'The Refinery: Accept an async validation/merge/cleanup job for a completed worktree node. 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 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 },\n required: ['node_id'],\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 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_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_TASK_HISTORY_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n];\n\n// ─── Tool Implementations ───────────────────────\n\nexport async function meshStatus(ctx: MeshContext): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const { mesh, transport } = ctx;\n const results: any[] = [];\n\n const ledgerSummary = getLedgerSummary(mesh.id);\n\n for (const node of mesh.nodes) {\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 if (!isLocalTransport(transport) && node.daemonId) {\n const result = await (transport as CloudTransport).gitStatus(node.daemonId, node.workspace, false, true);\n const status = extractGitStatus(result);\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 // Submodule out-of-sync warning\n const submodules = extractSubmodules(result, (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 } else if (isLocalTransport(transport)) {\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 // 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 } else {\n entry.health = 'unknown';\n entry.note = 'No daemonId available for cloud status probe';\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: 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 liveSessions = await collectLiveStatusSessions(ctx, node);\n if (liveSessions.length > 0) {\n entry.sessions = liveSessions;\n }\n\n results.push(entry);\n }\n\n const activeWorkEvidence = buildMeshActiveWork({\n meshId: mesh.id,\n queue: getQueue(mesh.id),\n ledgerEntries: readLedgerEntries(mesh.id, { tail: 500 }),\n nodes: results,\n });\n\n const response: Record<string, unknown> = {\n meshId: mesh.id,\n meshName: mesh.name,\n repoIdentity: mesh.repoIdentity,\n policy: mesh.policy,\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: results,\n activeWork: activeWorkEvidence.activeWork,\n staleDirectWork: activeWorkEvidence.staleDirectWork,\n terminalDirectWork: activeWorkEvidence.terminalDirectWork,\n activeWorkSummary: activeWorkEvidence.summary,\n branchConvergenceSummary: summarizeBranchConvergence(results),\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 try {\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\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 },\n): Promise<string> {\n const { mesh } = ctx;\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\n const tail = typeof args.tail === 'number' && args.tail > 0 ? args.tail : 20;\n const kind = typeof args.kind === 'string' && args.kind.trim() ? [args.kind.trim() as any] : undefined;\n const entries = readLedgerEntries(mesh.id, { tail, kind });\n const summary = getLedgerSummary(mesh.id);\n return JSON.stringify({\n meshId: mesh.id,\n entries,\n summary,\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 const slice = readLedgerSlice(ctx.mesh.id, queryArgs);\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'local',\n slice,\n status: 'local',\n }));\n continue;\n }\n\n const result = await commandForNode(ctx, node, 'get_mesh_ledger_slice', queryArgs);\n const payload = unwrapCommandPayload(result);\n if (payload?.success === false) {\n throw new Error(payload.error || 'remote get_mesh_ledger_slice failed');\n }\n const slice = payload?.slice ?? payload;\n if (slice?.protocol !== 'adhdev.mesh.ledger.slice.v1' || !Array.isArray(slice.entries)) {\n throw new Error('remote daemon returned an invalid ledger slice payload');\n }\n const importResult = shouldImport\n ? appendRemoteLedgerEntries(ctx.mesh.id, slice.entries)\n : { accepted: 0, skippedDuplicate: 0, rejectedInvalid: 0, entries: [] };\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'p2p_datachannel',\n slice,\n importResult,\n }));\n if (shouldImport && importResult.accepted > 0) {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_replicated',\n nodeId: node.id,\n payload: {\n protocol: 'adhdev.mesh.ledger.slice.v1',\n imported: importResult.accepted,\n skippedDuplicate: importResult.skippedDuplicate,\n rejectedInvalid: importResult.rejectedInvalid,\n nextAfterId: slice.cursor?.nextAfterId ?? null,\n via: 'p2p_datachannel',\n },\n });\n }\n } catch (e: any) {\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: node.daemonId ? 'p2p_datachannel' : 'local',\n status: 'failed',\n error: e?.message ?? String(e),\n }));\n }\n }\n\n const evidence = buildMeshLedgerReconciliationEvidence(ctx.mesh.id, replicas);\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_reconciled',\n payload: {\n protocol: evidence.protocol,\n sourceOfTruth: evidence.sourceOfTruth,\n totals: evidence.totals,\n convergence: evidence.convergence,\n },\n });\n return JSON.stringify({ success: true, evidence }, null, 2);\n}\n\nexport async function 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 meshEnqueueTask(\n ctx: MeshContext,\n args: { message: string; task_mode?: string; taskMode?: string },\n): Promise<string> {\n const taskMode = readString(args.task_mode) || readString(args.taskMode);\n try {\n const task = enqueueTask(ctx.mesh.id, args.message, { taskMode });\n\n // ── LocalTransport: queue-based pull (standalone daemon, all local) ─────\n if (isLocalTransport(ctx.transport) && !(ctx.transport instanceof IpcTransport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n return JSON.stringify({ success: true, source: 'queue', taskId: task.id, status: task.status, taskMode: task.taskMode });\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 if (ctx.transport instanceof IpcTransport) {\n // 1. Trigger local queue for local node pick-up\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\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\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(() => { /* non-fatal: no idle session or P2P failure */ }),\n );\n }\n // Fire-and-forget — don't block the coordinator response\n Promise.all(dispatchPromises).catch(() => {});\n\n return JSON.stringify({ success: true, source: 'queue', taskId: task.id, status: task.status, taskMode: task.taskMode });\n }\n\n // ── CloudTransport fallback ───────────────────────────────────────────────\n return JSON.stringify({ success: true, source: 'queue', taskId: task.id, status: task.status, taskMode: task.taskMode });\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 return JSON.stringify({ success: false, error: message });\n }\n}\n\nexport async function meshViewQueue(\n ctx: MeshContext,\n args: { status?: string[]; view?: QueueViewMode },\n): Promise<string> {\n try {\n await refreshMeshFromDaemon(ctx);\n const statusFilter = sanitizeQueueStatusFilter(args.status);\n const view = normalizeQueueViewMode(args.view);\n const fullQueue = prioritizeActiveQueueRows(annotateQueueStaleness(getQueue(ctx.mesh.id), 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 activeWorkEvidence = buildMeshActiveWork({\n meshId: ctx.mesh.id,\n queue: fullQueue,\n ledgerEntries: readLedgerEntries(ctx.mesh.id, { tail: 500 }),\n nodes: ctx.mesh.nodes,\n });\n const staleAssignedTasks = (maintenance as any).staleAssignedTasks || [];\n const requestedHistoricalRows = queue.some((task: any) => HISTORICAL_QUEUE_STATUSES.has(String(task?.status || '')));\n return JSON.stringify({\n success: true,\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,\n visibleQueue: queue,\n activeWork: activeWorkEvidence.activeWork,\n staleDirectWork: activeWorkEvidence.staleDirectWork,\n activeWorkSummary: activeWorkEvidence.summary,\n visibleSummary,\n summary,\n activeCounts: (summary as any).activeCounts,\n historicalCounts: (summary as any).historicalCounts,\n activeCount: (summary as any).activeCount,\n historicalCount: (summary as any).historicalCount,\n visibleActiveCounts: (visibleSummary as any).activeCounts,\n visibleHistoricalCounts: (visibleSummary as any).historicalCounts,\n visibleActiveCount: (visibleSummary as any).activeCount,\n visibleHistoricalCount: (visibleSummary as any).historicalCount,\n staleAssignedTasks,\n staleAssignedCount: (maintenance as any).staleAssignedCount,\n queueMaintenance: maintenance,\n cleanupDryRun: maintenance,\n ...(view === 'active' || statusFilter?.some(status => ACTIVE_QUEUE_STATUSES.has(status)) ? {\n activeQueue: queue.filter((task: any) => ACTIVE_QUEUE_STATUSES.has(String(task?.status || ''))),\n } : {}),\n ...(view === 'historical' || requestedHistoricalRows ? {\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: 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 if (isLocalTransport(ctx.transport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\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 },\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 });\n if (!task) return JSON.stringify({ success: false, error: `Queue task '${taskId}' not found` });\n if (isLocalTransport(ctx.transport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\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: { node_id: string; session_id?: string; message: string; task_mode?: string; taskMode?: string },\n): Promise<string> {\n const requestedTaskMode = readString(args.task_mode) || readString(args.taskMode);\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 // 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 // ── CloudTransport: delegate to Cloud API ──────────────────────────────\n if (!isLocalTransport(ctx.transport) && node.daemonId) {\n const res = await (ctx.transport as CloudTransport).meshEnqueueTask(node.daemonId, {\n meshId: ctx.mesh.id,\n message: args.message,\n targetNodeId: args.node_id,\n ...(taskMode ? { taskMode } : {}),\n });\n return JSON.stringify(res);\n }\n\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 = meshSessionProviderMetadata.get(meshSessionCacheKey(args.node_id, args.session_id || ''));\n const taskId = randomUUID();\n const result = await ipcDispatchToRemoteAgent(ctx, node, {\n session_id: args.session_id,\n message: args.message,\n providerType: cached?.providerType,\n });\n if (result.success) {\n // Record dispatch in ledger so task_history is accurate\n const dispatchedSessionId = args.session_id || result.sessionId;\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 } 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 && isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(meshSessionCacheKey(args.node_id, args.session_id));\n let resolvedProviderType = cached?.providerType || '';\n if (!resolvedProviderType) {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n const explicitSession = sessions.find(session => readSessionRecordId(session) === args.session_id);\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 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 });\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 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 });\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 const taskId = randomUUID();\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 }),\n });\n } catch { /* best-effort */ }\n return JSON.stringify({ success: true, dispatched: true, source: 'direct', taskId, taskMode, providerType: resolvedProviderType, nodeId: args.node_id, sessionId: args.session_id });\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 });\n\n if (isLocalTransport(ctx.transport) || ctx.transport instanceof IpcTransport) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\n\n // Also drain any pending coordinator events so the caller sees them inline\n const pendingEvents = isLocalTransport(ctx.transport)\n ? drainPendingMeshCoordinatorEvents(ctx.mesh.id)\n : [];\n\n const result: Record<string, unknown> = { success: true, source: 'queue', nodeId: args.node_id, taskId: task.id, status: task.status, taskMode: task.taskMode };\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 if (ctx.transport instanceof IpcTransport || isLocalTransport(ctx.transport)) {\n await drainCoordinatorPendingEvents(ctx, { nodeIds: [args.node_id] });\n }\n\n if (isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(meshSessionCacheKey(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 if (args.compact) {\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const targetId = `${node.daemonId}:session:${args.session_id}`;\n const res = await (ctx.transport as CloudTransport).readChat(targetId, {\n limit: args.tail ?? 10,\n sessionId: args.session_id,\n });\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh read_chat requires node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(meshSessionCacheKey(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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const targetId = `${node.daemonId}:session:${args.session_id}`;\n const res = await (ctx.transport as CloudTransport).getChatDebugBundle(targetId, {\n sessionId: args.session_id,\n tailLimit: args.tail ?? 40,\n delivery: args.delivery,\n });\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n }\n\n return JSON.stringify({ error: 'Cloud mesh read_debug requires node daemonId' });\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\n if (isLocalTransport(ctx.transport)) {\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 = coordinatorNode?.daemonId || ctx.localDaemonId;\n const spawnedSessionVisibility = readSpawnedSessionVisibility(ctx.mesh.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 meshNodeFor: ctx.mesh.id,\n meshNodeId: args.node_id,\n spawnedSessionVisibility,\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 });\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 if (ctx.transport instanceof IpcTransport && node.daemonId && !isLocalNode) {\n ctx.transport.meshCommand(node.daemonId, 'trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n } else if (isLocalTransport(ctx.transport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\n\n return JSON.stringify({\n ...launchPayload,\n resolvedProviderType,\n ...(providerSessionId ? { providerSessionId } : {}),\n }, null, 2);\n } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\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 resolvedProviderType = providerPriority[0]; // Best effort for cloud, skip detection\n }\n\n const coordinatorNode = resolveCoordinatorNode(ctx);\n const coordinatorDaemonId = coordinatorNode?.daemonId || ctx.localDaemonId;\n const spawnedSessionVisibility = readSpawnedSessionVisibility(ctx.mesh.policy);\n if (!coordinatorDaemonId) {\n return JSON.stringify(buildMissingCoordinatorDaemonIdFailure(ctx, node, resolvedProviderType), null, 2);\n }\n\n try {\n const res = await (ctx.transport as CloudTransport).launch(node.daemonId, {\n type: resolvedProviderType,\n dir: node.workspace,\n settings: {\n meshNodeFor: ctx.mesh.id,\n meshNodeId: args.node_id,\n spawnedSessionVisibility,\n ...(coordinatorDaemonId ? { meshCoordinatorDaemonId: coordinatorDaemonId } : {}),\n ...(coordinatorNode?.id ? { meshCoordinatorNodeId: coordinatorNode.id } : {}),\n launchedByCoordinator: true\n }\n });\n\n const runtimeSessionId = typeof res?.sessionId === 'string' ? res.sessionId : typeof res?.id === 'string' ? res.id : '';\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: {},\n });\n } catch { /* best-effort */ }\n\n return JSON.stringify({ ...res, resolvedProviderType }, null, 2);\n } catch (e: any) {\n return JSON.stringify(recordRecoverableLaunchFailure(ctx, node, resolvedProviderType, e), null, 2);\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh launch_session requires node daemonId' });\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 if (!isLocalTransport(ctx.transport) && node.daemonId) {\n const result = await (ctx.transport as CloudTransport).gitStatus(node.daemonId, node.workspace, true, true);\n return JSON.stringify({\n nodeId: args.node_id,\n workspace: node.workspace,\n status: extractGitStatus(result),\n diff: extractGitDiff(result),\n submodules: autoDiscoverSubmodules ? extractSubmodules(result, submoduleIgnorePaths) : undefined,\n relatedRepos: await collectRelatedRepoStatuses(ctx, node),\n }, null, 2);\n } else if (isLocalTransport(ctx.transport)) {\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 } else {\n return JSON.stringify({ error: 'No daemonId available for cloud git_status probe' });\n }\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; branch?: string; execute?: boolean; dry_run?: boolean; update_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 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 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 if (isLocalTransport(ctx.transport)) {\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: { message: args.message, commit: (result as any)?.checkpoint?.commit },\n });\n } catch { /* ledger append is best-effort */ }\n\n return JSON.stringify(result, null, 2);\n } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).gitCheckpoint(node.daemonId, {\n workspace: node.workspace,\n message: args.message,\n includeUntracked: true,\n });\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'checkpoint_created',\n nodeId: args.node_id,\n payload: { message: args.message, commit: (res as any)?.checkpoint?.commit },\n });\n } catch { /* best-effort */ }\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh checkpoint requires node daemonId' });\n }\n}\n\nexport async function meshApprove(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; action: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id); // membership check\n\n if (isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const targetId = `${node.daemonId}:session:${args.session_id}`;\n const res = await (ctx.transport as CloudTransport).approve(targetId, args.action === 'reject' ? 'reject' : 'approve');\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh approve requires node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\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 } else if (!isLocalTransport(ctx.transport) && sourceNode.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshCloneNode(sourceNode.daemonId, {\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(res);\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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh clone_node requires source node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshCleanupSessions(node.daemonId, {\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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh cleanup_sessions requires node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshRemoveNode(node.daemonId, {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n ...(args.session_cleanup_mode ? { sessionCleanupMode: args.session_cleanup_mode } : {}),\n inlineMesh: ctx.mesh,\n });\n if (res?.success && res.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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh remove_node requires node daemonId' });\n }\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 },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n if (isLocalTransport(ctx.transport)) {\n const result = await commandForNode(ctx, node, 'refine_mesh_node', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshRefineNode(node.daemonId, {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n inlineMesh: ctx.mesh,\n });\n if (res?.success && res.async !== true && res.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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh refine_node requires node daemonId' });\n }\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\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\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 async sendIpcCommand(type: string, args: Record<string, unknown>): Promise<any> {\n const WebSocketCtor = globalThis.WebSocket;\n if (!WebSocketCtor) {\n throw new Error('WebSocket is not available in this Node runtime; Node 20+ is required for daemon IPC mode');\n }\n\n return new Promise((resolve, reject) => {\n const requestId = `mcp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const ws = new WebSocketCtor(`ws://127.0.0.1:${this.port}${this.path}`);\n let settled = false;\n\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n try { ws.close(); } catch { /* noop */ }\n fn();\n };\n\n const nestedCommand = typeof args?.command === 'string' ? args.command : '';\n const targetDaemonId = typeof args?.targetDaemonId === 'string' ? args.targetDaemonId : '';\n const effectiveType = type === 'mesh_relay_command' && nestedCommand ? nestedCommand : type;\n const timeoutMs = Math.max(\n IPC_COMMAND_TIMEOUTS_MS[type] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\n IPC_COMMAND_TIMEOUTS_MS[effectiveType] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\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 const timeout = setTimeout(() => {\n finish(() => reject(new Error(`Daemon IPC ${diagnosticParts.join(' ')} timed out after ${Math.round(timeoutMs / 1000)}s (requestId=${requestId})`)));\n }, timeoutMs);\n\n let commandSent = false;\n const send = () => {\n if (commandSent) return;\n commandSent = true;\n ws.send(JSON.stringify({\n type: 'ext:command',\n payload: { command: type, args, requestId },\n }));\n };\n\n ws.addEventListener('open', () => {\n 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 ws.addEventListener('message', (event) => {\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 send();\n return;\n }\n if (msg?.type !== 'ext:command_result') return;\n if (msg?.payload?.requestId !== requestId) return;\n const payload = msg.payload;\n if (payload?.success === false) {\n finish(() => reject(new Error(payload.error || `Daemon IPC command '${type}' failed`)));\n return;\n }\n finish(() => resolve(payload?.result ?? payload));\n } catch {\n // Ignore non-JSON or unrelated daemon messages.\n }\n });\n\n ws.addEventListener('error', () => {\n finish(() => reject(new Error(`Cannot connect to daemon IPC at ws://127.0.0.1:${this.port}${this.path}`)));\n });\n });\n }\n}\n","import type { LocalTransport } from './local.js';\nimport type { CloudTransport } from './cloud.js';\nimport type { IpcTransport } from './ipc.js';\n\nexport type CommandTransport = LocalTransport | IpcTransport;\nexport type McpTransport = CommandTransport | CloudTransport;\n\n/**\n * Local/IPC and cloud transports are intentionally detected by an operation that\n * is unique to command-routed daemon modes. CloudTransport also exposes methods\n * like getStatus(targetId), so checking for getStatus incorrectly routes cloud\n * tools through command mode.\n */\nexport function isLocalTransport(\n transport: McpTransport,\n): transport is CommandTransport {\n return typeof (transport as { command?: unknown }).command === 'function';\n}\n","export type CompactChatMessage = Record<string, any>;\n\nfunction isAssistantLike(message: any): boolean {\n const role = String(message?.role ?? '').toLowerCase();\n return role === 'assistant' || role === 'agent';\n}\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\nexport function buildCompactMessageTail(\n visibleMessages: CompactChatMessage[],\n opts: { summary?: string; finalAssistant?: CompactChatMessage | undefined; limit: number },\n): CompactChatMessage[] {\n const summary = typeof opts.summary === 'string' ? opts.summary.trim() : '';\n const shouldOmitSummaryMessage = !!summary\n && !!opts.finalAssistant\n && isAssistantLike(opts.finalAssistant)\n && messageContent(opts.finalAssistant).trim() === summary;\n const sourceMessages = shouldOmitSummaryMessage\n ? visibleMessages.filter((message) => message !== opts.finalAssistant)\n : visibleMessages;\n return sourceMessages.slice(-opts.limit);\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 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: visible.length,\n omittedMessages: Math.max(0, rawMessages.length - visible.length),\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 --api-key <key> Cloud mode (ADHDev cloud API)\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, cloud, or ipc\n --port <n> Standalone or IPC daemon port (defaults: local 3847, ipc 19222)\n --password <pass> Standalone daemon password (if set)\n --api-key <key> ADHDev cloud API key (switches to cloud mode)\n --base-url <url> Override cloud API base URL\n --repo-mesh <mesh_id> Enable mesh mode — exposes only mesh-scoped coordinator tools\n --help Show this help\n\nEnvironment variables:\n ADHDEV_API_KEY API key (cloud mode)\n ADHDEV_PASSWORD Daemon password (local mode)\n ADHDEV_MESH_ID Mesh ID (mesh mode)\n ADHDEV_MCP_TRANSPORT Transport: local, cloud, 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 * Three modes:\n * local — talks to standalone daemon at localhost:3847\n * cloud — talks to ADHDev cloud API with an API key\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 { CloudTransport } from './transports/cloud.js';\nimport { IpcTransport } from './transports/ipc.js';\nimport type { McpTransport } 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 { 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,\n meshCleanupSessions, meshTaskHistory, meshReconcileLedger\n} from './tools/mesh-tools.js';\nimport type { MeshContext } from './tools/mesh-tools.js';\n\nexport interface AdhdevMcpServerOptions {\n mode: 'local' | 'cloud' | 'ipc';\n // local options\n port?: number;\n password?: string;\n // cloud options\n apiKey?: string;\n baseUrl?: 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: McpTransport =\n opts.mode === 'cloud'\n ? new CloudTransport({ apiKey: opts.apiKey!, baseUrl: opts.baseUrl })\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 : opts.mode === 'ipc'\n ? `Make sure the cloud daemon is running with local IPC enabled (adhdev daemon).`\n : `Check your API key and network connectivity.`;\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: Cloud API (when running with --api-key)\n if (!mesh && opts.mode === 'cloud' && opts.apiKey) {\n try {\n const base = opts.baseUrl || 'https://api.adhf.dev';\n const res = await fetch(`${base}/api/v1/repo-meshes/${opts.meshId}`, {\n headers: { 'Authorization': `Bearer ${opts.apiKey}`, 'Content-Type': 'application/json' },\n });\n if (res.ok) {\n const data = await res.json() as any;\n const rm = data.mesh;\n const nodes = data.nodes || [];\n // Convert cloud D1 record → LocalMeshEntry shape for mesh tools\n let policy: any = {};\n try { policy = JSON.parse(rm.policy_json || rm.policy || '{}'); } catch { /* */ }\n let coordinator: any = {};\n try { coordinator = JSON.parse(rm.coordinator_json || rm.coordinator_config || '{}'); } catch { /* */ }\n mesh = {\n id: rm.id,\n name: rm.name,\n repoIdentity: rm.repo_identity,\n repoRemoteUrl: rm.repo_remote_url,\n defaultBranch: rm.default_branch,\n policy: {\n requirePreTaskCheckpoint: false,\n requirePostTaskCheckpoint: true,\n requireApprovalForPush: true,\n allowAutoPublishSubmoduleMainCommits: false,\n requireApprovalForDestructiveGit: true,\n dirtyWorkspaceBehavior: 'warn',\n maxParallelTasks: 2,\n spawnedSessionVisibility: 'visible',\n ...policy,\n },\n coordinator,\n nodes: nodes.map((n: any) => ({\n id: n.id,\n workspace: n.workspace,\n repoRoot: n.repo_root,\n daemonId: n.daemon_id,\n userOverrides: {},\n policy: {},\n isLocalWorktree: false,\n })),\n createdAt: rm.created_at,\n updatedAt: rm.updated_at,\n };\n process.stderr.write(`[adhdev-mcp] Loaded mesh config from cloud API\\n`);\n }\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Cloud mesh fetch failed, falling back to local: ${e.message}\\n`);\n }\n }\n\n // Priority 3: 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 ${opts.mode === 'cloud' ? 'cloud or local' : '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.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.81' },\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); 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_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_task_history': text = await meshTaskHistory(meshCtx, a as any); break;\n case 'mesh_reconcile_ledger': text = await meshReconcileLedger(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 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, daemon_id: a.daemon_id });\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 'send_chat': {\n const text = await sendChat(transport, { message: a.message, session_id: a.session_id, daemon_id: a.daemon_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, daemon_id: a.daemon_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, daemon_id: a.daemon_id, 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, daemon_id: a.daemon_id, 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, daemon_id: a.daemon_id, 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, daemon_id: a.daemon_id });\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, daemon_id: a.daemon_id });\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 daemon_id: a.daemon_id,\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 daemon_id: a.daemon_id,\n type: a.type,\n });\n return { content: [{ type: 'text', text }] };\n }\n case 'check_pending': {\n const text = await checkPending(transport, { daemon_id: a.daemon_id, 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","/**\n * CloudTransport — HTTP client for ADHDev cloud API (api.adhf.dev)\n *\n * Uses shortcuts API: /api/v1/shortcuts/:targetId/*\n * Requires an API key (adk_*) with appropriate scopes.\n */\n\nconst DEFAULT_BASE_URL = 'https://api.adhf.dev';\n\nexport interface CloudTransportOptions {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class CloudTransport {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(opts: CloudTransportOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n private headers(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n };\n }\n\n async listRemoteMeshes(): Promise<{ meshes: any[] }> {\n const res = await fetch(`${this.baseUrl}/api/v1/repo-meshes`, { headers: this.headers() });\n if (!res.ok) throw new Error(`List remote meshes failed: ${res.status}`);\n return res.json() as any;\n }\n\n async createRemoteMesh(data: {\n name: string;\n repo_identity: string;\n repo_remote_url?: string;\n default_branch?: string;\n policy?: string;\n }): Promise<{ mesh: any }> {\n const res = await fetch(`${this.baseUrl}/api/v1/repo-meshes`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(data),\n });\n if (!res.ok) throw new Error(`Create remote mesh failed: ${res.status}`);\n return res.json() as any;\n }\n\n async deleteRemoteMesh(meshId: string): Promise<void> {\n const res = await fetch(`${this.baseUrl}/api/v1/repo-meshes/${encodeURIComponent(meshId)}`, {\n method: 'DELETE',\n headers: this.headers(),\n });\n if (!res.ok) throw new Error(`Delete remote mesh failed: ${res.status}`);\n }\n\n async listDaemons(): Promise<any> {\n const res = await fetch(`${this.baseUrl}/api/v1/daemons`, { headers: this.headers() });\n if (!res.ok) throw new Error(`List daemons failed: ${res.status}`);\n return res.json() as any;\n }\n\n async getStatus(targetId: string): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/status`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Status failed: ${res.status}`);\n return res.json() as any;\n }\n\n /** Get all sessions for a daemon (returns CompactSessionEntry[]). */\n async getDaemonStatus(daemonId: string): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/daemons/${encodeURIComponent(daemonId)}/status`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Daemon status failed: ${res.status}`);\n return res.json() as any;\n }\n\n async readChat(targetId: string, opts: { limit?: number; sessionId?: string } = {}): Promise<any> {\n const params = new URLSearchParams();\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.sessionId) params.set('sessionId', opts.sessionId);\n const qs = params.toString() ? `?${params}` : '';\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/chat${qs}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Read chat failed: ${res.status}`);\n return res.json() as any;\n }\n\n async getChatDebugBundle(\n targetId: string,\n opts: { sessionId?: string; agentType?: string; tailLimit?: number; delivery?: 'daemon_file' | 'inline' } = {},\n ): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/chat/debug`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({\n ...(opts.agentType ? { agentType: opts.agentType } : {}),\n ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),\n ...(opts.tailLimit ? { tailLimit: opts.tailLimit } : {}),\n ...(opts.delivery ? { delivery: opts.delivery } : {}),\n }),\n },\n );\n if (!res.ok) throw new Error(`Chat debug bundle failed: ${res.status}`);\n return res.json() as any;\n }\n\n async sendChat(targetId: string, message: string, opts: { sessionId?: string; ideType?: string } = {}): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/chat`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ message, ...opts }),\n },\n );\n if (!res.ok) throw new Error(`Send chat failed: ${res.status}`);\n return res.json() as any;\n }\n\n async approve(targetId: string, action: 'approve' | 'reject', agentType?: string): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/approve`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ action, ...(agentType ? { agentType } : {}) }),\n },\n );\n if (!res.ok) throw new Error(`Approve failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitStatus(daemonId: string, workspace: string, includeDiff = true, refreshUpstream = false): Promise<any> {\n const params = new URLSearchParams({ workspace, includeDiff: String(includeDiff), refreshUpstream: String(refreshUpstream) });\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-status?${params}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Git status failed: ${res.status}`);\n return res.json() as any;\n }\n\n async stop(daemonId: string, opts: { id?: string; type?: string; dir?: string }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/stop`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Stop failed: ${res.status}`);\n return res.json() as any;\n }\n\n async launch(daemonId: string, opts: { type: string; dir?: string; model?: string; settings?: Record<string, any> }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/launch`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Launch failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitLog(daemonId: string, workspace: string, opts: { limit?: number; file?: string; since?: string; until?: string } = {}): Promise<any> {\n const params = new URLSearchParams({ workspace });\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.file) params.set('file', opts.file);\n if (opts.since) params.set('since', opts.since);\n if (opts.until) params.set('until', opts.until);\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-log?${params}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Git log failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitDiff(daemonId: string, workspace: string, opts: { file?: string; maxLines?: number; staged?: boolean } = {}): Promise<any> {\n const params = new URLSearchParams({ workspace });\n if (opts.file) params.set('file', opts.file);\n if (opts.maxLines) params.set('maxLines', String(opts.maxLines));\n if (opts.staged) params.set('staged', 'true');\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-diff?${params}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Git diff failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitPush(daemonId: string, opts: { workspace: string; remote?: string; branch?: string }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-push`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Git push failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitCheckpoint(daemonId: string, opts: { workspace: string; message: string; includeUntracked?: boolean }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-checkpoint`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Git checkpoint failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshCloneNode(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/clone-node`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh clone node failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshRemoveNode(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/remove-node`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh remove node failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshCleanupSessions(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/cleanup-sessions`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh cleanup sessions failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshEnqueueTask(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/enqueue`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh enqueue task failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshRefineNode(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/refine-node`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh refine node failed: ${res.status}`);\n return res.json() as any;\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.listDaemons();\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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:\n 'List all connected agent sessions. In cloud mode, fetches session state from each daemon ' +\n '(data is sourced from daemon WS status reports, up to 30s stale). ' +\n 'Pass daemon_id to scope to a single daemon.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit to list sessions across all daemons.',\n },\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listSessions(\n transport: McpTransport,\n args: { daemon_id?: string; format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n if (isLocalTransport(transport)) {\n // Local: 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\n // Cloud: UserSessionDO /list-daemons intentionally strips sessions[] (P2P architecture —\n // session data flows to dashboard via P2P DataChannel, not server WS).\n // MCP must fetch sessions directly from each DaemonConnectionDO's WS status cache.\n return listSessionsCloud(transport, args.daemon_id, asJson);\n}\n\nasync function listSessionsCloud(\n transport: CloudTransport,\n daemonId: string | undefined,\n asJson: boolean,\n): Promise<string> {\n const collected: Array<{ daemonId: string; session: any }> = [];\n\n if (daemonId) {\n const daemonStatus = await transport.getDaemonStatus(daemonId);\n for (const s of daemonStatus?.sessions ?? []) {\n collected.push({ daemonId, session: s });\n }\n } else {\n const data = await transport.listDaemons();\n const daemons: any[] = data?.daemons ?? [];\n\n // Batch 5 at a time to avoid flooding the API\n for (let i = 0; i < daemons.length; i += 5) {\n await Promise.allSettled(\n daemons.slice(i, i + 5).map(async (d) => {\n try {\n const daemonStatus = await transport.getDaemonStatus(d.id);\n for (const s of daemonStatus?.sessions ?? []) {\n collected.push({ daemonId: d.id, session: s });\n }\n } catch {\n // skip unreachable daemons\n }\n }),\n );\n }\n }\n\n if (asJson) {\n return JSON.stringify({\n sessions: collected.map(({ daemonId: dId, session: s }) => ({\n daemon_id: dId,\n id: s.id,\n type: s.providerType ?? 'unknown',\n status: s.status ?? null,\n workspace: s.workspace ?? null,\n })),\n }, null, 2);\n }\n\n if (collected.length === 0) return 'No active sessions.';\n const lines = collected.map(({ daemonId: dId, session: s }) => {\n const parts = [\n `daemon: ${dId}`,\n `session: ${s.id}`,\n `type: ${s.providerType ?? 'unknown'}`,\n ];\n if (s.status) parts.push(`status: ${s.status}`);\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n return parts.join(', ');\n });\n return `Sessions (${collected.length}):\\n${lines.join('\\n')}`;\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 all connected daemons (machines running the ADHDev agent). ' +\n 'Use this to discover daemon IDs before calling launch_session, git_status, or other tools that require daemon_id. ' +\n 'In local mode returns the single standalone daemon info.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listDaemons(\n transport: McpTransport,\n args: { format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n if (isLocalTransport(transport)) {\n // Local: single standalone 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\n // Cloud: full daemon list from UserSessionDO\n const data = await transport.listDaemons();\n const daemons: any[] = data?.daemons ?? [];\n\n if (asJson) {\n return JSON.stringify({\n daemons: daemons.map((d) => ({\n id: d.id,\n hostname: d.hostname ?? null,\n platform: d.platform ?? null,\n nickname: d.nickname ?? null,\n version: d.version ?? null,\n p2p_available: d.p2p?.available ?? null,\n cdp_connected: d.cdpConnected ?? null,\n })),\n }, null, 2);\n }\n\n if (daemons.length === 0) return 'No connected daemons.';\n const lines = daemons.map((d) => {\n const parts = [`id: ${d.id}`];\n if (d.nickname) parts.push(`nickname: ${d.nickname}`);\n if (d.hostname) parts.push(`hostname: ${d.hostname}`);\n if (d.platform) parts.push(`platform: ${d.platform}`);\n if (d.version) parts.push(`version: ${d.version}`);\n if (d.p2p?.available != null) parts.push(`p2p: ${d.p2p.available ? 'yes' : 'no'}`);\n return parts.join(', ');\n });\n return `Daemons (${daemons.length}):\\n${lines.join('\\n')}`;\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit for local mode.',\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: McpTransport,\n args: { session_id?: string; limit?: number; daemon_id?: string; format?: 'text' | 'json'; compact?: boolean },\n): Promise<string> {\n const limit = args.limit ?? 50;\n\n if (isLocalTransport(transport)) {\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\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = args.session_id ? `${args.daemon_id}:session:${args.session_id}` : args.daemon_id;\n const result = await transport.readChat(targetId, { limit, sessionId: args.session_id });\n const annotated = annotateRapidReadChatAdvisory(result as Record<string, any>, {\n key: `cloud:${args.daemon_id}:${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 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 (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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit for local mode.',\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: McpTransport,\n args: {\n session_id?: string;\n daemon_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 let result: any;\n if (isLocalTransport(transport)) {\n result = await transport.command('get_chat_debug_bundle', commandArgs);\n } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = `${args.daemon_id}:session:${sessionId}`;\n result = await transport.getChatDebugBundle(targetId, {\n sessionId,\n agentType: args.agent_type,\n tailLimit,\n delivery,\n });\n }\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 { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit for local mode.',\n },\n },\n required: ['message'],\n },\n};\n\nexport async function sendChat(\n transport: McpTransport,\n args: { message: string; session_id?: string; daemon_id?: string },\n): Promise<string> {\n if (!args.message?.trim()) throw new Error('message is required');\n\n if (isLocalTransport(transport)) {\n // LocalTransport\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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = args.session_id ? `${args.daemon_id}:session:${args.session_id}` : args.daemon_id;\n const result = await transport.sendChat(targetId, args.message, {\n ...(args.session_id ? { sessionId: args.session_id } : {}),\n });\n if (result?.success === false) return `Error: ${result.error ?? 'send_chat failed'}`;\n return 'Message sent.';\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only).',\n },\n },\n required: ['action'],\n },\n};\n\nexport async function approve(\n transport: McpTransport,\n args: { action: 'approve' | 'reject'; session_id?: string; daemon_id?: string },\n): Promise<string> {\n const action = args.action === 'reject' ? 'reject' : 'approve';\n\n if (isLocalTransport(transport)) {\n // LocalTransport\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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = args.session_id ? `${args.daemon_id}:session:${args.session_id}` : args.daemon_id;\n const result = await transport.approve(targetId, action);\n if (result?.success === false) return `Error: ${result.error ?? 'approve failed'}`;\n return `Action ${action}d.`;\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 'Local mode only — screenshots require direct P2P access to the daemon and are not available in cloud mode.',\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: McpTransport,\n args: { session_id?: string },\n): Promise<{ type: 'image'; data: string; mimeType: string } | { type: 'text'; text: string }> {\n let result: any;\n\n if (isLocalTransport(transport)) {\n result = await transport.command('screenshot', {\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n } else {\n // CloudTransport: use shortcuts status endpoint — screenshot not on shortcuts, fall back to error\n return { type: 'text', text: 'Screenshots are not available in cloud mode. Run adhdev mcp in local mode (requires standalone daemon).' };\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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitStatus(\n transport: McpTransport,\n args: { workspace: string; include_diff?: boolean; daemon_id?: string; format?: 'text' | 'json' },\n): Promise<string> {\n let status: any;\n let diffSummary: any;\n\n if (isLocalTransport(transport)) {\n const statusResult = await transport.command('git_status', {\n workspace: args.workspace,\n });\n status = 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 } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitStatus(\n args.daemon_id,\n args.workspace,\n args.include_diff !== false,\n );\n if (result?.error) {\n if (args.format === 'json') return JSON.stringify({ error: result.error }, null, 2);\n return `Error: ${result.error}`;\n }\n status = result?.status;\n diffSummary = result?.diff;\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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitLog(\n transport: McpTransport,\n args: {\n workspace: string;\n limit?: number;\n file?: string;\n since?: string;\n until?: string;\n daemon_id?: 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;\n if (isLocalTransport(transport)) {\n raw = 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 } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitLog(args.daemon_id, args.workspace, {\n limit,\n file: args.file,\n since: args.since,\n until: args.until,\n });\n raw = result?.log ?? result;\n }\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, McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\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: McpTransport,\n args: {\n workspace: string;\n file?: string;\n max_lines?: number;\n staged?: boolean;\n daemon_id?: string;\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 if (isLocalTransport(transport)) {\n return localGitDiff(transport, args.workspace, args.file, maxLines, staged, args.format);\n }\n\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitDiff(args.daemon_id, args.workspace, {\n file: args.file,\n maxLines,\n staged,\n });\n\n if (result?.error) {\n if (args.format === 'json') return JSON.stringify({ error: result.error }, null, 2);\n return `Git diff error: ${result.error}`;\n }\n\n return formatDiffResult(result, 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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n },\n required: ['workspace', 'message'],\n },\n};\n\nexport async function gitCheckpoint(\n transport: McpTransport,\n args: {\n workspace: string;\n message: string;\n include_untracked?: boolean;\n daemon_id?: string;\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;\n if (isLocalTransport(transport)) {\n raw = await transport.command('git_checkpoint', {\n workspace: args.workspace,\n message,\n includeUntracked: args.include_untracked ?? false,\n });\n raw = raw?.checkpoint ?? raw;\n } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitCheckpoint(args.daemon_id, {\n workspace: args.workspace,\n message,\n includeUntracked: args.include_untracked ?? false,\n });\n raw = result?.checkpoint ?? result;\n }\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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitPush(\n transport: McpTransport,\n args: {\n workspace: string;\n remote?: string;\n branch?: string;\n daemon_id?: string;\n },\n): Promise<string> {\n let raw: any;\n\n if (isLocalTransport(transport)) {\n raw = 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 } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitPush(args.daemon_id, {\n workspace: args.workspace,\n remote: args.remote,\n branch: args.branch,\n });\n raw = result?.push ?? result;\n }\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 { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Required in cloud mode.',\n },\n },\n required: ['type'],\n },\n};\n\nexport async function launchSession(\n transport: McpTransport,\n args: { type: string; workspace?: string; model?: string; daemon_id?: string },\n): Promise<string> {\n if (isLocalTransport(transport)) {\n // LocalTransport\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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.launch(args.daemon_id, {\n type: args.type,\n dir: args.workspace,\n model: args.model,\n });\n if (result?.success === false || result?.error) 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 { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n type: {\n type: 'string',\n description:\n 'Provider type (e.g. hermes-cli, claude-cli). Local mode auto-resolves from session_id if omitted; cloud mode forwards the session_id and omits type unless explicitly provided.',\n },\n },\n required: ['session_id'],\n },\n};\n\nexport async function stopSession(\n transport: McpTransport,\n args: { session_id: string; daemon_id?: string; type?: string },\n): Promise<string> {\n if (isLocalTransport(transport)) {\n const local = transport;\n let resolvedType = args.type;\n\n // Auto-resolve type from session status if not provided\n if (!resolvedType) {\n const status = await local.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 local.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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.stop(args.daemon_id, {\n id: args.session_id,\n ...(args.type ? { type: args.type } : {}),\n });\n if (result?.success === false || result?.error) return `Error: ${result.error ?? 'stop failed'}`;\n return `Session ${args.session_id} stopped.`;\n}\n","import type { CommandTransport, McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID to check (cloud mode). Omit to check all daemons.',\n },\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function checkPending(\n transport: McpTransport,\n args: { daemon_id?: string; format?: 'text' | 'json' },\n): Promise<string> {\n if (isLocalTransport(transport)) {\n return checkPendingLocal(transport, args.format);\n }\n return checkPendingCloud(transport, args.daemon_id, args.format);\n}\n\nasync function checkPendingLocal(\n transport: CommandTransport,\n 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 (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\nasync function checkPendingCloud(\n transport: CloudTransport,\n daemonId?: string,\n format?: 'text' | 'json',\n): Promise<string> {\n const pending: Array<{ daemonId: string; session: any }> = [];\n\n if (daemonId) {\n const daemonStatus = await transport.getDaemonStatus(daemonId);\n const sessions: any[] = daemonStatus?.sessions ?? [];\n for (const s of sessions) {\n if (s.status === 'waiting_approval') pending.push({ daemonId, session: s });\n }\n } else {\n const data = await transport.listDaemons();\n const daemons: any[] = data?.daemons ?? [];\n\n // Process in batches of 5 to avoid flooding the API with concurrent requests\n for (let i = 0; i < daemons.length; i += 5) {\n await Promise.allSettled(\n daemons.slice(i, i + 5).map(async (d) => {\n try {\n const daemonStatus = await transport.getDaemonStatus(d.id);\n const sessions: any[] = daemonStatus?.sessions ?? [];\n for (const s of sessions) {\n if (s.status === 'waiting_approval') pending.push({ daemonId: d.id, session: s });\n }\n } catch {\n // skip unreachable daemons\n }\n }),\n );\n }\n }\n\n if (format === 'json') {\n return JSON.stringify({\n pending: pending.map(({ daemonId: dId, session: s }) => ({\n daemon_id: dId,\n session_id: s.id,\n workspace: s.workspace ?? null,\n type: s.providerType ?? null,\n modal_message: null,\n buttons: [],\n })),\n }, null, 2);\n }\n\n if (pending.length === 0) return 'No sessions waiting for approval.';\n const lines = pending.map(({ daemonId: dId, session: s }) => {\n const parts = [`daemon_id: ${dId}`, `session_id: ${s.id}`];\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n if (s.providerType) parts.push(`type: ${s.providerType}`);\n parts.push('(use read_chat to see the approval prompt)');\n return parts.join('\\n ');\n });\n return `Pending approvals (${pending.length}):\\n\\n${lines.join('\\n\\n')}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBA,yBAA2B;;;ACT3B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,iCAAiC;AACvC,IAAM,0BAAkD;AAAA,EACtD,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,aAAa;AACf;AAOO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EAER,YAAY,OAA4B,CAAC,GAAG;AAC1C,SAAK,OAAO,KAAK,QAAQ;AACzB,SAAK,OAAO,KAAK,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,oBAAoB,KAAK,IAAI,SAAS;AAC9D,aAAO,IAAI;AAAA,IACb,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,YAA0B;AAC9B,WAAO,KAAK,QAAQ,qBAAqB;AAAA,EAC3C;AAAA,EAEA,MAAM,QAAQ,MAAc,OAAgC,CAAC,GAAiB;AAC5E,WAAO,KAAK,eAAe,MAAM,IAAI;AAAA,EACvC;AAAA,EAEA,MAAM,YACJ,gBACA,SACA,OAAgC,CAAC,GACnB;AACd,WAAO,KAAK,eAAe,sBAAsB;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,eAAe,MAAc,MAA6C;AACtF,UAAM,gBAAgB,WAAW;AACjC,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,2FAA2F;AAAA,IAC7G;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,YAAY,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC7E,YAAM,KAAK,IAAI,cAAc,kBAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE;AACtE,UAAI,UAAU;AAEd,YAAM,SAAS,CAAC,OAAmB;AACjC,YAAI,QAAS;AACb,kBAAU;AACV,qBAAa,OAAO;AACpB,YAAI;AAAE,aAAG,MAAM;AAAA,QAAG,QAAQ;AAAA,QAAa;AACvC,WAAG;AAAA,MACL;AAEA,YAAM,gBAAgB,OAAO,MAAM,YAAY,WAAW,KAAK,UAAU;AACzE,YAAM,iBAAiB,OAAO,MAAM,mBAAmB,WAAW,KAAK,iBAAiB;AACxF,YAAM,gBAAgB,SAAS,wBAAwB,gBAAgB,gBAAgB;AACvF,YAAM,YAAY,KAAK;AAAA,QACrB,wBAAwB,IAAI,KAAK;AAAA,QACjC,wBAAwB,aAAa,KAAK;AAAA,MAC5C;AACA,YAAM,kBAAkB;AAAA,QACtB,YAAY,IAAI;AAAA,QAChB,GAAI,gBAAgB,CAAC,mBAAmB,aAAa,GAAG,IAAI,CAAC;AAAA,QAC7D,GAAI,iBAAiB,CAAC,mBAAmB,eAAe,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;AAAA,QAC5E,GAAI,OAAO,MAAM,WAAW,WAAW,CAAC,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC;AAAA,QACtE,GAAI,OAAO,MAAM,cAAc,WAAW,CAAC,cAAc,KAAK,SAAS,GAAG,IAAI,CAAC;AAAA,MACjF;AACA,YAAM,UAAU,WAAW,MAAM;AAC/B,eAAO,MAAM,OAAO,IAAI,MAAM,cAAc,gBAAgB,KAAK,GAAG,CAAC,oBAAoB,KAAK,MAAM,YAAY,GAAI,CAAC,gBAAgB,SAAS,GAAG,CAAC,CAAC;AAAA,MACrJ,GAAG,SAAS;AAEZ,UAAI,cAAc;AAClB,YAAM,OAAO,MAAM;AACjB,YAAI,YAAa;AACjB,sBAAc;AACd,WAAG,KAAK,KAAK,UAAU;AAAA,UACrB,MAAM;AAAA,UACN,SAAS,EAAE,SAAS,MAAM,MAAM,UAAU;AAAA,QAC5C,CAAC,CAAC;AAAA,MACJ;AAEA,SAAG,iBAAiB,QAAQ,MAAM;AAChC,WAAG,KAAK,KAAK,UAAU;AAAA,UACrB,MAAM;AAAA,UACN,SAAS;AAAA,YACP,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,kBAAkB;AAAA,YAClB,YAAY,cAAc,QAAQ,GAAG;AAAA,YACrC,WAAW;AAAA,YACX,kBAAkB,CAAC;AAAA,UACrB;AAAA,QACF,CAAC,CAAC;AAAA,MACJ,CAAC;AAED,SAAG,iBAAiB,WAAW,CAAC,UAAU;AACxC,YAAI;AACF,gBAAM,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,OAAO,MAAM,IAAI;AAC3E,gBAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,cAAI,KAAK,SAAS,kBAAkB;AAClC,iBAAK;AACL;AAAA,UACF;AACA,cAAI,KAAK,SAAS,qBAAsB;AACxC,cAAI,KAAK,SAAS,cAAc,UAAW;AAC3C,gBAAM,UAAU,IAAI;AACpB,cAAI,SAAS,YAAY,OAAO;AAC9B,mBAAO,MAAM,OAAO,IAAI,MAAM,QAAQ,SAAS,uBAAuB,IAAI,UAAU,CAAC,CAAC;AACtF;AAAA,UACF;AACA,iBAAO,MAAM,QAAQ,SAAS,UAAU,OAAO,CAAC;AAAA,QAClD,QAAQ;AAAA,QAER;AAAA,MACF,CAAC;AAED,SAAG,iBAAiB,SAAS,MAAM;AACjC,eAAO,MAAM,OAAO,IAAI,MAAM,kDAAkD,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,MAC3G,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;ACzIO,SAAS,iBACd,WAC+B;AAC/B,SAAO,OAAQ,UAAoC,YAAY;AACjE;;;ACfA,SAAS,gBAAgB,SAAuB;AAC9C,QAAM,OAAO,OAAO,SAAS,QAAQ,EAAE,EAAE,YAAY;AACrD,SAAO,SAAS,eAAe,SAAS;AAC1C;AAEO,SAAS,eAAe,SAAsB;AACnD,QAAM,UAAU,SAAS;AACzB,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,QAAQ,IAAI,CAAC,SAAe,OAAO,SAAS,WAAW,OAAO,MAAM,QAAQ,EAAG,EAAE,KAAK,EAAE;AAAA,EACjG;AACA,SAAO;AACT;AAEO,SAAS,4BAA4B,SAAuB;AACjE,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACpD,MAAI,SAAS,UAAU,SAAS,YAAY,SAAS,QAAS,QAAO;AACrE,QAAM,OAAO,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,eAAe,EAAE,EAAE,YAAY;AAC3F,MAAI,CAAC,QAAQ,aAAa,eAAe,YAAY,YAAY,WAAW,SAAS,QAAQ,EAAE,SAAS,IAAI,EAAG,QAAO;AACtH,QAAM,OAAO,QAAQ,QAAQ,QAAQ;AACrC,MAAI,MAAM,aAAa,QAAQ,MAAM,UAAU,QAAQ,MAAM,YAAY,QAAQ,MAAM,gBAAgB,SAAS,MAAM,iBAAiB,MAAO,QAAO;AACrJ,SAAO,SAAS,UAAU,SAAS,eAAe,SAAS;AAC7D;AAEO,SAAS,wBACd,iBACA,MACsB;AACtB,QAAM,UAAU,OAAO,KAAK,YAAY,WAAW,KAAK,QAAQ,KAAK,IAAI;AACzE,QAAM,2BAA2B,CAAC,CAAC,WAC9B,CAAC,CAAC,KAAK,kBACP,gBAAgB,KAAK,cAAc,KACnC,eAAe,KAAK,cAAc,EAAE,KAAK,MAAM;AACpD,QAAM,iBAAiB,2BACnB,gBAAgB,OAAO,CAAC,YAAY,YAAY,KAAK,cAAc,IACnE;AACJ,SAAO,eAAe,MAAM,CAAC,KAAK,KAAK;AACzC;AAEO,SAAS,mBACd,SACA,OAAuE,CAAC,GACnE;AACL,QAAM,cAAc,MAAM,QAAQ,SAAS,QAAQ,IAAI,QAAQ,WAAW,CAAC;AAC3E,QAAM,UAAU,YAAY,OAAO,2BAA2B;AAC9D,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC;AACxD,QAAM,iBAAiB,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,YAAiB;AACnE,UAAM,OAAO,OAAO,SAAS,QAAQ,EAAE,EAAE,YAAY;AACrD,YAAQ,SAAS,eAAe,SAAS,YAAY,eAAe,OAAO,EAAE,KAAK;AAAA,EACpF,CAAC;AACD,QAAM,UAAU,OAAO,SAAS,YAAY,YAAY,QAAQ,QAAQ,KAAK,IACzE,QAAQ,QAAQ,KAAK,IACrB,eAAe,cAAc,EAAE,KAAK;AACxC,QAAM,WAAW,wBAAwB,SAAS,EAAE,SAAS,gBAAgB,MAAM,CAAC;AAEpF,SAAO;AAAA,IACL,SAAS,SAAS,YAAY;AAAA,IAC9B,SAAS;AAAA,IACT,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC7C,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACpE,QAAQ,SAAS,UAAU;AAAA,IAC3B,mBAAmB,SAAS,qBAAqB;AAAA,IACjD,eAAe,YAAY;AAAA,IAC3B,iBAAiB,QAAQ;AAAA,IACzB,kBAAkB,QAAQ;AAAA,IAC1B,iBAAiB,KAAK,IAAI,GAAG,YAAY,SAAS,QAAQ,MAAM;AAAA,IAChE;AAAA,IACA,GAAI,SAAS,iBAAiB,SAAY,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,IACpF,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AACF;;;AC1EO,IAAM,qCAAqC;AAElD,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAiBD,IAAM,cAAc,oBAAI,IAAwB;AAMzC,SAAS,uBAAuB,QAA0B;AAC/D,SAAO,OAAO,WAAW,YAAY,qBAAqB,IAAI,OAAO,YAAY,CAAC;AACpF;AAEO,SAAS,8BACd,SACA,SAOiD;AACjD,QAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;AACpC,QAAM,SAAS,QAAQ,UAAU,SAAS,UAAU,SAAS,MAAM,UAAU,SAAS,QAAQ;AAC9F,QAAM,SAAS,uBAAuB,MAAM;AAC5C,QAAM,WAAW,YAAY,IAAI,QAAQ,GAAG;AAE5C,MAAI,CAAC,QAAQ;AACX,gBAAY,IAAI,QAAQ,KAAK,EAAE,IAAI,KAAK,QAAQ,OAAO,WAAW,WAAW,SAAS,OAAU,CAAC;AACjG,WAAO;AAAA,EACT;AAEA,cAAY,IAAI,QAAQ,KAAK,EAAE,IAAI,KAAK,QAAQ,OAAO,WAAW,WAAW,SAAS,OAAU,CAAC;AAEjG,MAAI,CAAC,YAAY,CAAC,uBAAuB,SAAS,MAAM,EAAG,QAAO;AAClE,QAAM,YAAY,MAAM,SAAS;AACjC,MAAI,YAAY,KAAK,aAAa,mCAAoC,QAAO;AAE7E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,UAAU,QAAQ;AAAA,MAClB,UAAU;AAAA,MACV;AAAA,MACA,qBAAqB,SAAS,KAAK;AAAA,MACnC,4BAA4B,QAAQ,QAAQ,0BAA0B;AAAA,MACtE,SAAS,yBAAyB,OAAO,MAAM,CAAC,oBAAoB,QAAQ,QAAQ;AAAA,IACtF;AAAA,EACF;AACF;;;AJhDA,yBAmBO;AAkBP,IAAM,8BAA8B,oBAAI,IAAyC;AAIjF,SAAS,WAAW,OAAoC;AACpD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACtE;AAEA,SAAS,qBAAqB,SAA6D;AACvF,QAAM,cAAc,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACtD,QAAM,YAAY,YAAY,SAAS,KAAK,GAAG,YAAY,MAAM,GAAG,EAAE,CAAC,QAAQ;AAC/E,SAAO,EAAE,WAAW,aAAa,mBAAmB,YAAY;AACpE;AAEA,SAAS,uBACL,SACA,KACA,MAMuB;AACvB,QAAM,aAAa,qBAAqB,OAAO;AAC/C,SAAO;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ,KAAK;AAAA,IACb;AAAA,IACA,WAAW,WAAW;AAAA,IACtB,aAAa,WAAW;AAAA,IACxB,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IACnD,GAAI,KAAK,eAAe,EAAE,cAAc,KAAK,aAAa,IAAI,CAAC;AAAA,IAC/D,GAAI,KAAK,kBAAkB,EAAE,iBAAiB,KAAK,gBAAgB,IAAI,CAAC;AAAA,EAC5E;AACJ;AAEA,SAAS,SAAS,MAAsB,QAAoC;AACxE,QAAM,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACjD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,SAAS,MAAM,8BAA8B,KAAK,IAAI,GAAG;AACpF,SAAO;AACX;AAEA,IAAM,+BAA+B;AACrC,IAAM,0BAA0B,KAAK;AACrC,IAAM,iCAAiC,IAAI,KAAK,KAAK;AACrD,IAAM,wBAAwB,oBAAI,IAAI,CAAC,WAAW,UAAU,CAAC;AAC7D,IAAM,4BAA4B,oBAAI,IAAI,CAAC,aAAa,UAAU,WAAW,CAAC;AAQ9E,eAAe,sBAAsB,KAAiC;AAClE,MAAI,EAAE,IAAI,qBAAqB,cAAe;AAC9C,MAAI;AACA,UAAM,SAAS,MAAO,IAAI,UAA2B,QAAQ,YAAY,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC;AAChG,QAAI,CAAC,QAAQ,WAAW,CAAC,MAAM,QAAQ,OAAO,MAAM,KAAK,EAAG;AAC5D,UAAM,iBAAiB,OAAO,KAAK,MAC9B,OAAO,CAAC,MAAW,GAAG,EAAE,EACxB,IAAI,CAAC,MAAW,CAAuB;AAC5C,IAAC,IAAI,KAAK,MAA+B,OAAO,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG,cAAc;AAC3F,QAAI,KAAK,YAAY,OAAO,KAAK,aAAa,IAAI,KAAK;AAAA,EAC3D,QAAQ;AAAA,EAAkF;AAC9F;AAEA,eAAe,+BAA+B,KAAiC;AAC3E,MAAI,EAAE,IAAI,qBAAqB,cAAe;AAC9C,MAAI;AACA,UAAO,IAAI,UAA2B,QAAQ,YAAY;AAAA,MACtD,QAAQ,IAAI,KAAK;AAAA,MACjB,YAAY,IAAI;AAAA,IACpB,CAAC;AAAA,EACL,QAAQ;AAAA,EAER;AACJ;AAEA,eAAe,oBAAoB,KAAkB,QAA6C;AAC9F,QAAM,MAAM,IAAI,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACpD,MAAI,OAAO,CAAC,IAAI,gBAAiB,QAAO;AAExC,QAAM,sBAAsB,GAAG;AAE/B,QAAM,YAAY,IAAI,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAC1D,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,SAAS,MAAM,8BAA8B,IAAI,KAAK,IAAI,GAAG;AAC7F,SAAO;AACX;AAEA,eAAe,4BAA4B,KAAkB,QAAoD;AAC7G,QAAM,MAAM,IAAI,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACpD,MAAI,OAAO,CAAC,IAAI,gBAAiB,QAAO;AAExC,QAAM,sBAAsB,GAAG;AAE/B,SAAO,IAAI,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,KAAK;AACxD;AAEA,SAAS,2BAA2B,KAAkB,MAAmI;AACrL,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,oBAAoB,KAAK,QAAQ,KAAK;AAE5C,aAAW,YAAQ,6BAAS,IAAI,KAAK,EAAE,GAAG;AACtC,UAAM,YAAY,IAAI,KAAK,KAAK,aAAa,KAAK,SAAS,EAAE,QAAQ;AACrE,QAAI,CAAC,OAAO,SAAS,SAAS,KAAK,MAAM,YAAY,6BAA8B;AACnF,QAAI,KAAK,gBAAgB,KAAK,iBAAiB,KAAK,QAAS;AAC7D,QAAI,KAAK,kBAAkB,KAAK,mBAAmB,KAAK,QAAS;AACjE,QAAI,KAAK,cAAc,KAAK,oBAAoB,KAAK,cAAc,KAAK,sBAAsB,KAAK,WAAY;AAC/G,QAAI,KAAK,SAAS,KAAK,MAAM,mBAAmB;AAC5C,aAAO,EAAE,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ;AAAA,IAC3D;AAAA,EACJ;AAEA,QAAM,cAAU,sCAAkB,IAAI,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAC5D,WAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC7C,UAAM,QAAQ,QAAQ,CAAC;AACvB,UAAM,YAAY,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AACpD,QAAI,OAAO,SAAS,SAAS,KAAK,MAAM,YAAY,6BAA8B;AAClF,QAAI,MAAM,SAAS,kBAAmB;AACtC,QAAI,MAAM,WAAW,KAAK,QAAS;AACnC,QAAI,KAAK,cAAc,MAAM,cAAc,KAAK,WAAY;AAC5D,QAAI,OAAO,MAAM,SAAS,YAAY,SAAU;AAChD,QAAI,MAAM,QAAQ,QAAQ,KAAK,MAAM,mBAAmB;AACpD,aAAO,EAAE,WAAW,MAAM,OAAO,QAAQ,SAAS;AAAA,IACtD;AAAA,EACJ;AACA,SAAO,EAAE,WAAW,MAAM;AAC9B;AAEA,SAAS,iCAAiC,KAAkB,MAAwI;AAChM,QAAM,cAAU,sCAAkB,IAAI,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAC5D,QAAM,iBAAiB,QAAQ,OAAO,WAAS,MAAM,WAAW,KAAK,WAAW,MAAM,cAAc,KAAK,UAAU;AACnH,QAAM,mBAAmB,eAAe,OAAO,WAAS,MAAM,SAAS,gBAAgB;AACvF,QAAM,eAAe,CAAC,GAAG,cAAc,EAAE,QAAQ,EAAE,KAAK,WAAS,MAAM,SAAS,iBAAiB;AACjG,QAAM,eAAe,CAAC,GAAG,cAAc,EAAE,QAAQ,EAAE,KAAK,WAAS,MAAM,SAAS,oBAAoB,MAAM,SAAS,iBAAiB,MAAM,SAAS,cAAc;AACjK,QAAM,cAAc,CAAC,GAAG,cAAc,EAAE,QAAQ,EAAE,KAAK,WAAS,MAAM,SAAS,cAAc;AAC7F,QAAM,aAAa,CAAC,GAAG,cAAc,EAAE,QAAQ,EAAE,KAAK,WAAS,MAAM,SAAS,kBAAkB;AAChG,QAAM,oBAAoB,KAAK,uBACxB,WAAW,cAAc,SAAS,iBAAiB,KACnD,WAAW,YAAY,SAAS,iBAAiB,KACjD,WAAW,cAAc,SAAS,iBAAiB;AAC1D,QAAM,eAAe,WAAW,cAAc,SAAS,YAAY,KAC5D,WAAW,cAAc,SAAS,cAAc,KAChD,WAAW,cAAc,SAAS,OAAO;AAChD,QAAM,SAAS;AAAA,IACX,oBAAoB,iBAAiB,SAAS;AAAA,IAC9C,kBAAkB,CAAC,CAAC;AAAA,IACpB,cAAc,cAAc,gBAAgB,YAAY,gBAAgB,cAAc;AAAA,IACtF;AAAA,IACA,eAAe,aAAa;AAAA,IAC5B,oBAAoB,WAAW,aAAa,SAAS,kBAAkB;AAAA,IACvE,kBAAkB,WAAW,cAAc,SAAS,gBAAgB,KAAK,WAAW,cAAc,SAAS,eAAe;AAAA,EAC9H;AAEA,MAAI,cAAc;AACd,QAAI,KAAK,YAAY,MAAM;AACvB,aAAO;AAAA,QACH,GAAG,mBAAmB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR;AAAA,UACA,SAAS;AAAA,UACT,UAAU,CAAC,EAAE,MAAM,aAAa,SAAS,cAAc,cAAc,KAAK,CAAC;AAAA,QAC/E,GAAG;AAAA,UACC,QAAQ,KAAK;AAAA,UACb,WAAW,KAAK;AAAA,UAChB,OAAO,KAAK,QAAQ;AAAA,QACxB,CAAC;AAAA,QACD,qBAAqB;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,MACH,SAAS;AAAA,MACT,SAAS;AAAA,MACT,qBAAqB;AAAA,MACrB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,SAAS;AAAA,MACT;AAAA,MACA,UAAU,CAAC,EAAE,MAAM,aAAa,SAAS,cAAc,cAAc,KAAK,CAAC;AAAA,IAC/E;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO,SAAS,KAAK,OAAO,sCAAsC,IAAI,KAAK,IAAI;AAAA,IAC/E,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,8BAA8B,OAAO;AAAA,IACrC,cAAc,eAAe;AAAA,MACzB,WAAW,aAAa;AAAA,MACxB,WAAW,aAAa;AAAA,MACxB,cAAc,aAAa;AAAA,MAC3B,QAAQ,OAAO,aAAa,SAAS,WAAW,WAAW,aAAa,QAAQ,SAAS;AAAA,MACzF,gBAAgB,OAAO,aAAa,SAAS,YAAY,WAAW,aAAa,QAAQ,QAAQ,MAAM,GAAG,GAAG,IAAI;AAAA,IACrH,IAAI;AAAA,IACJ,mBAAmB,eAAe;AAAA,MAC9B,MAAM,aAAa;AAAA,MACnB,WAAW,aAAa;AAAA,MACxB,WAAW,aAAa;AAAA,MACxB,cAAc,aAAa;AAAA,MAC3B,QAAQ,OAAO,aAAa,SAAS,WAAW,WAAW,aAAa,QAAQ,SAAS;AAAA,MACzF,SAAS,aAAa;AAAA,IAC1B,IAAI;AAAA,IACJ,WAAW;AAAA,MACP,oBACM,kDAAkD,iBAAiB,gEACnE;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,eAAe;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AACJ;AAOA,SAAS,oBAAoB,SAAkC;AAC3D,SAAO,WAAW,SAAS,EAAE,KACtB,WAAW,SAAS,SAAS,KAC7B,WAAW,SAAS,UAAU,KAC9B,WAAW,SAAS,gBAAgB,KACpC,WAAW,SAAS,kBAAkB,KACtC,WAAW,SAAS,UAAU,KAC9B,WAAW,SAAS,WAAW;AAC1C;AAEA,SAAS,8BAA8B,OAAmB;AACtD,QAAM,UAAU,qBAAqB,KAAK;AAC1C,QAAM,SAAS,SAAS,UAAU,OAAO,QAAQ,WAAW,WACtD,QAAQ,SACR;AACN,SAAO,MAAM,QAAQ,QAAQ,QAAQ,IAAI,OAAO,WAAW,CAAC;AAChE;AAEA,SAAS,2BAA2B,SAAsB;AACtD,SAAO,WAAW,SAAS,YAAY,KAChC,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,SAAS,KAC7B;AACX;AAEA,SAAS,iBAAiB,QAAqB,SAAoB;AAC/D,MAAI,CAAC,WAAW,OAAO,YAAY,YAAY,wBAAwB,OAAO,EAAG;AACjF,QAAM,YAAY,oBAAoB,OAAO;AAC7C,MAAI,UAAW,QAAO,IAAI,SAAS;AACvC;AAEA,SAAS,sBAAsB,MAAwB;AACnD,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,gBAAgB;AAAA,IAClB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,WAAW;AAAA,IACjB,MAAM,YAAY;AAAA,IAClB,MAAM,WAAW,QAAQ;AAAA,IACzB,MAAM,YAAY,QAAQ;AAAA,EAC9B;AACA,aAAW,SAAS,eAAe;AAC/B,QAAI,MAAM,QAAQ,KAAK,EAAG,OAAM,QAAQ,aAAW,iBAAiB,UAAU,OAAO,CAAC;AAAA,EAC1F;AAEA,QAAM,iBAAiB;AAAA,IACnB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,WAAW;AAAA,IACjB,MAAM,YAAY;AAAA,IAClB,MAAM,WAAW;AAAA,IACjB,MAAM,YAAY;AAAA,IAClB,MAAM,WAAW;AAAA,IACjB,MAAM,YAAY;AAAA,EACtB;AACA,iBAAe,QAAQ,aAAW,iBAAiB,UAAU,OAAO,CAAC;AACrE,SAAO;AACX;AAEA,SAAS,wBAAwB,MAA2C;AACxE,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,iBAAiB,oBAAI,IAAyB;AACpD,aAAW,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,KAAK,QAAQ,CAAC,GAAG;AAC7D,UAAM,SAAS,WAAY,KAAa,EAAE,KAAK,WAAY,KAAa,MAAM,KAAK,WAAY,KAAa,OAAO;AACnH,QAAI,CAAC,OAAQ;AACb,YAAQ,IAAI,MAAM;AAClB,UAAM,WAAW,sBAAsB,IAAI;AAC3C,QAAI,SAAS,OAAO,EAAG,gBAAe,IAAI,QAAQ,QAAQ;AAAA,EAC9D;AACA,SAAO,EAAE,SAAS,eAAe;AACrC;AAEA,SAAS,2BAA2B,MAAW,UAAkD;AAC7F,MAAI,MAAM,WAAW,WAAY,QAAO;AACxC,QAAM,SAAS,WAAW,KAAK,cAAc,KAAK,WAAW,KAAK,MAAM,KAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,YAAY;AACrI,QAAM,YAAY,WAAW,KAAK,iBAAiB,KAAK,WAAW,KAAK,SAAS,KAAK,WAAW,KAAK,UAAU,KAAK,WAAW,KAAK,eAAe;AAEpJ,MAAI,UAAU,SAAS,QAAQ,OAAO,KAAK,CAAC,SAAS,QAAQ,IAAI,MAAM,GAAG;AACtE,WAAO;AAAA,EACX;AACA,MAAI,UAAU,aAAa,SAAS,eAAe,IAAI,MAAM,KAAK,CAAC,SAAS,eAAe,IAAI,MAAM,EAAG,IAAI,SAAS,GAAG;AACpH,WAAO;AAAA,EACX;AAEA,QAAM,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AACnD,QAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,KAAK,IAAI,IAAI,YAAY;AACpE,MAAI,CAAC,UAAU,UAAU,QAAQ,SAAS,yBAAyB;AAC/D,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,wBAAwB,OAAuC;AACpE,QAAM,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,EAAE;AAChF,MAAI,gBAAgB;AACpB,aAAW,QAAQ,OAAO;AACtB,UAAM,SAAS,OAAO,MAAM,WAAW,WAAW,KAAK,SAAS;AAChE,QAAI,UAAU,OAAO,UAAU,eAAe,KAAK,QAAQ,MAAM,GAAG;AAChE,aAAO,MAA6B,KAAK;AAAA,IAC7C;AACA,QAAI,WAAW,cAAc,MAAM,kBAAkB,KAAM,kBAAiB;AAAA,EAChF;AACA,QAAM,eAAe,KAAK,IAAI,GAAG,OAAO,WAAW,aAAa;AAChE,SAAO;AAAA,IACH,YAAY,MAAM;AAAA,IAClB,aAAa,OAAO,UAAU;AAAA,IAC9B,iBAAiB,OAAO,YAAY,OAAO,SAAS,OAAO;AAAA,IAC3D;AAAA,IACA,cAAc;AAAA,MACV,SAAS,OAAO;AAAA,MAChB,UAAU;AAAA,IACd;AAAA,IACA,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,IACrB;AAAA,IACA,kBAAkB;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,IACtB;AAAA,EACJ;AACJ;AAEA,SAAS,uBAAuB,OAA+B;AAC3D,SAAO,UAAU,YAAY,UAAU,gBAAgB,UAAU,QAAQ,QAAQ;AACrF;AAEA,SAAS,0BAA0B,OAAsC;AACrE,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,QAAM,WAAW,MACZ,IAAI,UAAQ,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI,EAAE,EACvD,OAAO,YAAU,sBAAsB,IAAI,MAAM,KAAK,0BAA0B,IAAI,MAAM,CAAC;AAChG,SAAO,SAAS,SAAS,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI;AAC7D;AAEA,SAAS,mBAAmB,OAAc,MAAqB,UAA4B;AACvF,MAAI,UAAU,QAAQ;AAClB,UAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,WAAO,MAAM,OAAO,UAAQ,QAAQ,IAAI,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC;AAAA,EACvE;AACA,MAAI,SAAS,SAAU,QAAO,MAAM,OAAO,UAAQ,sBAAsB,IAAI,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC;AACxG,MAAI,SAAS,aAAc,QAAO,MAAM,OAAO,UAAQ,0BAA0B,IAAI,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC;AAChH,SAAO;AACX;AAEA,SAAS,0BAA0B,OAAqB;AACpD,QAAM,SAAgB,CAAC;AACvB,QAAM,aAAoB,CAAC;AAC3B,QAAM,QAAe,CAAC;AACtB,aAAW,QAAQ,OAAO;AACtB,UAAM,SAAS,OAAO,MAAM,UAAU,EAAE;AACxC,QAAI,sBAAsB,IAAI,MAAM,EAAG,QAAO,KAAK,IAAI;AAAA,aAC9C,0BAA0B,IAAI,MAAM,EAAG,YAAW,KAAK,IAAI;AAAA,QAC/D,OAAM,KAAK,IAAI;AAAA,EACxB;AACA,SAAO,CAAC,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU;AAC9C;AAEA,SAAS,cAAc,MAAoC;AACvD,SAAO;AAAA,IACH,IAAI,MAAM;AAAA,IACV,QAAQ,MAAM;AAAA,IACd,gBAAgB,MAAM;AAAA,IACtB,mBAAmB,MAAM;AAAA,IACzB,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB,eAAe,MAAM,kBAAkB;AAAA,IACvC,aAAa,MAAM;AAAA,EACvB;AACJ;AAEA,SAAS,4BAA4B,OAAuC;AACxE,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,qBAAqB,MACtB,OAAO,UAAQ,MAAM,WAAW,cAAc,MAAM,kBAAkB,IAAI,EAC1E,IAAI,aAAa;AACtB,QAAM,kBAAkB,MAAM,OAAO,UAAQ,0BAA0B,IAAI,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC;AACtG,QAAM,qBAAqB,gBACtB,OAAO,UAAQ;AACZ,UAAM,YAAY,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AACpD,WAAO,OAAO,SAAS,SAAS,KAAK,MAAM,aAAa;AAAA,EAC5D,CAAC,EACA,IAAI,WAAS;AAAA,IACV,GAAG,cAAc,IAAI;AAAA,IACrB,cAAc;AAAA,IACd,QAAQ;AAAA,EACZ,EAAE;AACN,QAAM,oBAAoB;AAAA,IACtB,GAAG,mBAAmB,IAAI,WAAS;AAAA,MAC/B,GAAG;AAAA,MACH,cAAc;AAAA,MACd,QAAQ,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,MAClE,oBAAoB;AAAA,IACxB,EAAE;AAAA,IACF,GAAG,mBAAmB,IAAI,WAAS;AAAA,MAC/B,GAAG;AAAA,MACH,oBAAoB;AAAA,IACxB,EAAE;AAAA,EACN;AACA,SAAO;AAAA,IACH,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IACtB;AAAA,IACA,oBAAoB,mBAAmB;AAAA,IACvC,uBAAuB,gBAAgB;AAAA,IACvC,0BAA0B,mBAAmB;AAAA,IAC7C;AAAA,IACA,uBAAuB,kBAAkB;AAAA,EAC7C;AACJ;AAEA,SAAS,uBAAuB,OAAc,MAA8B;AACxE,QAAM,WAAW,wBAAwB,IAAI;AAC7C,QAAM,MAAM,KAAK,IAAI;AACrB,SAAO,MAAM,IAAI,UAAQ;AACrB,UAAM,aAAa,OAAO,MAAM,WAAW,WAAW,KAAK,SAAS;AACpE,UAAM,YAAY;AAAA,MACd,GAAG;AAAA,MACH;AAAA,MACA,UAAU,aAAa,sBAAsB,IAAI,UAAU,IAAI;AAAA,MAC/D,cAAc,aAAa,0BAA0B,IAAI,UAAU,IAAI;AAAA,MACvE,cAAc,MAAM;AAAA,MACpB,GAAI,eAAe,aAAa,EAAE,cAAc,KAAK,GAAG,IAAI,CAAC;AAAA,MAC7D,GAAI,eAAe,eAAe,eAAe,WAAW;AAAA,QACxD,aAAa,KAAK;AAAA,MACtB,IAAI,CAAC;AAAA,IACT;AACA,QAAI,eAAe,WAAY,QAAO;AACtC,UAAM,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AACnD,UAAM,QAAQ,OAAO,SAAS,SAAS,IAAI,MAAM,YAAY;AAC7D,UAAM,cAAc,2BAA2B,MAAM,QAAQ;AAC7D,QAAI,CAAC,YAAa,QAAO;AACzB,WAAO;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,eAAe;AAAA,MACf;AAAA,MACA,GAAI,UAAU,OAAO,EAAE,eAAe,MAAM,IAAI,CAAC;AAAA,IACrD;AAAA,EACJ,CAAC;AACL;AAEA,SAAS,qBAAqB,OAAiB;AAC3C,MAAI,UAAU;AACd,QAAM,OAAO,oBAAI,IAAS;AAC1B,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACvC,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,KAAK,IAAI,OAAO,EAAG;AAClE,SAAK,IAAI,OAAO;AAEhB,UAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU;AAC3C,cAAU;AAAA,EACd;AACA,SAAO;AACX;AAEA,SAAS,wBAAwB,SAAuB;AACpD,QAAM,SAAS,OAAO,SAAS,WAAW,WAAW,QAAQ,OAAO,YAAY,IAAI;AACpF,QAAM,YAAY,OAAO,SAAS,cAAc,WAAW,QAAQ,UAAU,YAAY,IAAI;AAC7F,QAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,MAAM,YAAY,IAAI;AACjF,SAAO,CAAC,QAAQ,WAAW,KAAK,EAAE,KAAK,WAAS,CAAC,WAAW,UAAU,cAAc,UAAU,QAAQ,EAAE,SAAS,KAAK,CAAC;AAC3H;AAEA,SAAS,oBAAoB,SAAuB;AAChD,MAAI,wBAAwB,OAAO,EAAG,QAAO;AAC7C,QAAM,SAAS,OAAO,SAAS,WAAW,WAAW,QAAQ,OAAO,YAAY,IAAI;AACpF,QAAM,aAAa,OAAO,SAAS,YAAY,WAAW,WAAW,QAAQ,WAAW,OAAO,YAAY,IAAI;AAC/G,SAAO,WAAW,UAAU,eAAe;AAC/C;AAEA,SAAS,2BAA2B,SAAc,QAAgB,QAAyB;AACvF,QAAM,WAAW,SAAS;AAC1B,QAAM,gBAAgB,OAAO,UAAU,gBAAgB,WAAW,SAAS,YAAY,KAAK,IAAI;AAChG,QAAM,sBAAsB,OAAO,UAAU,4BAA4B,WAAW,SAAS,wBAAwB,KAAK,IAAI;AAC9H,QAAM,gBAAgB,OAAO,UAAU,eAAe,WAAW,SAAS,WAAW,KAAK,IAAI;AAC9F,MAAI,kBAAkB,UAAU,CAAC,oBAAqB,QAAO;AAC7D,SAAO,CAAC,iBAAiB,kBAAkB;AAC/C;AAEA,SAAS,0BAA0B,UAAiB,cAAsB,QAAgB,QAAiC;AACvH,QAAM,OAAO,SAAS,OAAO,aAAW,CAAC,wBAAwB,OAAO,CAAC;AACzE,QAAM,mBAAmB,CAAC,YAAiB,CAAC,gBAAgB,SAAS,iBAAiB,gBAAgB,SAAS,YAAY;AAC3H,QAAM,eAAe,KAAK;AAAA,IAAO,CAAC,YAC9B,2BAA2B,SAAS,QAAQ,MAAM;AAAA,EACtD;AACA,SAAO,aAAa,KAAK,aAAW,oBAAoB,OAAO,KAAK,iBAAiB,OAAO,CAAC,KACtF,aAAa,KAAK,gBAAgB,KAClC;AACX;AAEA,SAAS,qCAAqC,KAAkB,MAA0B,WAAmB,cAAsF;AAC/L,SAAO;AAAA,IACH,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,QAAQ,IAAI,KAAK;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,IAChB;AAAA,IACA,GAAI,eAAe,EAAE,sBAAsB,aAAa,IAAI,CAAC;AAAA,IAC7D,OAAO,mBAAmB,SAAS,iCAAiC,IAAI,KAAK,EAAE;AAAA,IAC/E,YAAY,wEAAwE,KAAK,EAAE,IAAI,eAAe,YAAY,YAAY,MAAM,EAAE;AAAA,IAC9I,kBAAkB;AAAA,EACtB;AACJ;AAEA,SAAS,uCAAuC,KAAkB,MAA0B,cAAsF;AAC9K,SAAO;AAAA,IACH,SAAS;AAAA,IACT,aAAa;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,QAAQ,IAAI,KAAK;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,IAChB,GAAI,eAAe,EAAE,sBAAsB,aAAa,IAAI,CAAC;AAAA,IAC7D,OAAO,kDAAkD,KAAK,EAAE;AAAA,IAChE,YAAY;AAAA,IACZ,kBAAkB;AAAA,EACtB;AACJ;AAEA,SAAS,kBAAkB,OAAY,WAA2C;AAC9E,QAAM,OAAO,oBAAI,IAAS;AAC1B,QAAM,QAAgD,CAAC,EAAE,SAAS,OAAO,OAAO,EAAE,CAAC;AAEnF,SAAO,MAAM,QAAQ;AACjB,UAAM,EAAE,SAAS,MAAM,IAAI,MAAM,IAAI;AACrC,QAAI,UAAU,OAAO,EAAG,QAAO;AAC/B,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,KAAK,IAAI,OAAO,KAAK,SAAS,EAAG;AAChF,SAAK,IAAI,OAAO;AAKhB,eAAW,OAAO,CAAC,WAAW,QAAQ,GAAG;AACrC,UAAI,OAAO,QAAS,OAAM,KAAK,EAAE,SAAS,QAAQ,GAAG,GAAG,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC9E;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,wBAAwB,OAAiB;AAC9C,SAAO,kBAAkB,OAAO,aAAW,QAAQ,SAAS,MAAM,EAAE,CAAC;AACzE;AAEA,SAAS,iBAAiB,OAAiB;AACvC,QAAM,UAAU,qBAAqB,KAAK;AAC1C,SAAO,SAAS,UAAU,OAAO,UAAU;AAC/C;AAEA,SAAS,eAAe,OAAiB;AACrC,QAAM,UAAU,qBAAqB,KAAK;AAC1C,SAAO,SAAS,eAAe,SAAS,QAAQ,OAAO,eAAe,OAAO,QAAQ;AACzF;AAEA,SAAS,kBAAkB,OAAY,aAA0C;AAC7E,QAAM,UAAU,qBAAqB,KAAK;AAC1C,QAAM,OAAO,SAAS,QAAQ,cACvB,SAAS,cACT,OAAO,QAAQ,cACf,OAAO;AACd,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO;AACjC,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAM,YAAY,IAAI,IAAI,WAAW;AACrC,SAAO,KAAK,OAAO,CAAC,MAAW,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,IAAI,CAAC;AACpE;AAEA,SAAS,sBAAsB,OAAgC,QAAmB;AAC9E,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG;AACpE,QAAM,MAAM;AAChB;AAEA,SAAS,qBAAqB,OAAiB;AAC3C,SAAO,kBAAkB,OAAO,aAAW,QAAQ,SAAS,aAAa,SAAS,MAAM,SAAS,gBAAgB,CAAC;AACtH;AAYA,SAAS,0BAA0B,OAAiD;AAChF,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe;AACxF,QAAM,QAAQ,QAAQ,YAAY;AAClC,QAAM,wBAAoB,4CAAwB,OAAO,EAAE,SAAS,aAAa,CAAC;AAClF,MAAI,kBAAkB,aAAa;AAC/B,WAAO;AAAA,EACX;AACA,MAAI,MAAM,SAAS,8BAA8B,KAAK,MAAM,SAAS,oBAAoB,GAAG;AACxF,WAAO;AAAA,MACH,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,YAAY;AAAA,IAChB;AAAA,EACJ;AACA,MAAI,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,SAAS,GAAG;AAC1D,WAAO;AAAA,MACH,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,YAAY;AAAA,IAChB;AAAA,EACJ;AACA,SAAO;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,YAAY;AAAA,EAChB;AACJ;AAEA,SAAS,yBAAyB,MAA+D;AAC7F,MAAI,CAAC,KAAK,gBAAiB,QAAO;AAClC,SAAO;AAAA,IACH,MAAM;AAAA,IACN,MAAM,EAAE,SAAS,KAAK,IAAI,sBAAsB,WAAW;AAAA,IAC3D,MAAM,wGAAwG,KAAK,EAAE;AAAA,EACzH;AACJ;AAEA,SAAS,8BACL,KACA,MACA,cACA,OACuB;AACvB,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe;AACxF,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,UAAU,yBAAyB,IAAI;AAC7C,SAAO;AAAA,IACH,SAAS;AAAA,IACT,aAAa,WAAW;AAAA,IACxB,MAAM,WAAW;AAAA,IACjB,QAAQ,WAAW;AAAA,IACnB,WAAW,WAAW;AAAA,IACtB,kBAAkB,WAAW;AAAA,IAC7B,YAAY,WAAW;AAAA,IACvB,GAAI,WAAW,mBAAmB,EAAE,kBAAkB,WAAW,iBAAiB,IAAI,CAAC;AAAA,IACvF,OAAO;AAAA,IACP,QAAQ,IAAI,KAAK;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,IAChB,iBAAiB,KAAK,oBAAoB;AAAA,IAC1C,gBAAgB,KAAK;AAAA,IACrB,kBAAkB,KAAK;AAAA,IACvB,GAAI,eAAe,EAAE,sBAAsB,aAAa,IAAI,CAAC;AAAA,IAC7D,WAAW,uCAAuC,KAAK,EAAE,IAAI,eAAe,YAAY,YAAY,MAAM,EAAE;AAAA,IAC5G,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7B,eAAe;AAAA,MACX,uCAAuC,KAAK,EAAE,IAAI,eAAe,YAAY,YAAY,MAAM,EAAE;AAAA,MACjG,GAAI,UAAU,CAAC,gEAAgE,KAAK,EAAE,6BAA6B,IAAI,CAAC;AAAA,MACxH;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,SAAS,+BACL,KACA,MACA,cACA,OACuB;AACvB,QAAM,UAAU,8BAA8B,KAAK,MAAM,cAAc,KAAK;AAC5E,MAAI;AACA,8CAAkB,IAAI,KAAK,IAAI;AAAA,MAC3B,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,SAAS;AAAA,QACL,OAAO;AAAA,QACP,GAAG;AAAA,MACP;AAAA,IACJ,CAAC;AAAA,EACL,QAAQ;AAAA,EAAqC;AAC7C,SAAO;AACX;AAEA,SAAS,6BAA6B,QAAgB,QAAgD;AAClG,QAAM,cAAU,sCAAkB,QAAQ,EAAE,MAAM,IAAI,CAAC;AACvD,WAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC7C,UAAM,QAAQ,QAAQ,CAAC;AACvB,QAAI,MAAM,WAAW,OAAQ;AAC7B,QAAI,MAAM,SAAS,sBAAsB,MAAM,SAAS,eAAgB,QAAO;AAC/E,QAAI,MAAM,SAAS,wBAAwB,MAAM,SAAS,UAAU,yBAAyB;AACzF,aAAO,EAAE,WAAW,MAAM,WAAW,GAAG,MAAM,QAAQ;AAAA,IAC1D;AAAA,EACJ;AACA,SAAO;AACX;AAMA,SAAS,gCACL,OACA,SAC2D;AAC3D,QAAM,cAAU,gDAA4B,OAAO;AAAA,IAC/C,SAAS,QAAQ;AAAA,IACjB,gBAAgB,QAAQ;AAAA,EAC5B,CAAC;AACD,SAAO;AAAA,IACH,GAAG;AAAA,IACH,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,IACnD,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC5D,WAAW,QAAQ,mBAAmB,QAAQ,aAAa;AAAA,EAC/D;AACJ;AAWA,eAAe,yBACX,KACA,MACA,MACkC;AAClC,QAAM,YAAY,IAAI;AACtB,QAAM,WAAW,KAAK;AAEtB,MAAI,YAAY,KAAK,YAAY,KAAK,KAAK;AAE3C,QAAM,uBAAiC,MAAM,QAAS,KAAK,QAAgB,gBAAgB,IACpF,KAAK,OAAe,mBACrB,CAAC;AACP,MAAI,uBAAuB,KAAK,cAAc,KAAK,KAAK,qBAAqB,CAAC,KAAK;AAKnF,MAAI,CAAC,aAAa,KAAK,YAAY;AAC/B,QAAI;AACA,YAAM,cAAc,MAAM,UAAU,YAAY,UAAU,uBAAuB,CAAC,CAAC;AACnF,YAAM,WAAW,8BAA8B,WAAW;AAE1D,UAAI,WAAW;AACX,cAAM,kBAAkB,SAAS,KAAK,aAAW,oBAAoB,OAAO,MAAM,SAAS;AAC3F,YAAI,CAAC,iBAAiB;AAClB,iBAAO;AAAA,YACH,SAAS;AAAA,YACT,aAAa;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,kBAAkB;AAAA,YAClB,QAAQ,IAAI,KAAK;AAAA,YACjB,QAAQ,KAAK;AAAA,YACb;AAAA,YACA,WAAW,KAAK;AAAA,YAChB;AAAA,YACA,GAAI,uBAAuB,EAAE,qBAAqB,IAAI,CAAC;AAAA,YACvD,OAAO,mBAAmB,SAAS,iDAAiD,KAAK,EAAE;AAAA,YAC3F,YAAY,6DAA6D,KAAK,EAAE,IAAI,uBAAuB,YAAY,oBAAoB,MAAM,EAAE;AAAA,UACvJ;AAAA,QACJ;AACA,YAAI,CAAC,2BAA2B,iBAAiB,IAAI,KAAK,IAAI,KAAK,EAAE,GAAG;AACpE,iBAAO;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA,wBAAwB,2BAA2B,eAAe,KAAK;AAAA,UAC3E;AAAA,QACJ;AACA,YAAI,CAAC,sBAAsB;AACvB,iCAAuB,2BAA2B,eAAe;AAAA,QACrE;AAAA,MACJ,OAAO;AAIH,cAAM,gBAAgB,0BAA0B,UAAU,sBAAsB,IAAI,KAAK,IAAI,KAAK,EAAE;AAEpG,YAAI,eAAe,MAAM,eAAe,WAAW;AAC/C,sBAAY,cAAc,MAAM,cAAc;AAC9C,cAAI,CAAC,sBAAsB;AACvB,mCAAuB,2BAA2B,aAAa;AAAA,UACnE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,SAAS,GAAQ;AACb,UAAI,WAAW;AACX,eAAO;AAAA,UACH,GAAG,gCAAgC,GAAG;AAAA,YAClC,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,QAAQ,KAAK;AAAA,YACb;AAAA,UACJ,CAAC;AAAA,UACD,SAAS;AAAA,UACT,OAAO,iCAAiC,SAAS,sBAAsB,GAAG,WAAW,OAAO,CAAC,CAAC;AAAA,QAClG;AAAA,MACJ;AAAA,IAEJ;AAAA,EACJ;AAGA,MAAI,CAAC,sBAAsB;AACvB,WAAO,EAAE,SAAS,OAAO,OAAO,mCAAmC,KAAK,EAAE,sGAAsG;AAAA,EACpL;AAEA,MAAI;AACA,UAAM,iBAAiB,MAAM,UAAU,YAAY,UAAU,iBAAiB;AAAA,MAC1E,GAAI,YAAY,EAAE,iBAAiB,UAAU,IAAI,CAAC;AAAA,MAClD,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,IAClB,CAAC;AACD,UAAM,kBAAkB,qBAAqB,cAAc;AAC3D,QAAI,iBAAiB,YAAY,SAAS,gBAAgB,YAAY,OAAO;AACzE,YAAM,SAAS,iBAAiB,YAAY,QAAQ,kBAAkB;AACtE,YAAM,eAAe,iBAAiB,SAAS,gBAAgB,SAAS;AACxE,aAAO;AAAA,QACH,GAAG,gCAAgC,QAAQ,SAAS,cAAc;AAAA,UAC9D,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,QAAQ,KAAK;AAAA,UACb;AAAA,QACJ,CAAC;AAAA,QACD,GAAI,UAAU,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,QACrD,SAAS;AAAA,QACT,OAAO,wBAAwB,YAAY;AAAA,MAC/C;AAAA,IACJ;AACA,WAAO,EAAE,SAAS,MAAM,YAAY,MAAM,WAAW,aAAa,sBAAsB,cAAc,qBAAqB;AAAA,EAC/H,SAAS,GAAQ;AACb,UAAM,eAAe,GAAG,WAAW,OAAO,CAAC;AAC3C,WAAO;AAAA,MACH,GAAG,gCAAgC,GAAG;AAAA,QAClC,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb;AAAA,MACJ,CAAC;AAAA,MACD,OAAO,wBAAwB,YAAY;AAAA,IAC/C;AAAA,EACJ;AACJ;AAEA,SAAS,uBAAuB,KAAkD;AAC9E,QAAM,kBAAkB,OAAO,IAAI,KAAK,aAAa,oBAAoB,WACnE,IAAI,KAAK,YAAY,gBAAgB,KAAK,IAC1C;AACN,MAAI,iBAAiB;AACjB,UAAM,YAAY,IAAI,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,mBAAmB,OAAO,EAAE,aAAa,YAAY,EAAE,SAAS,KAAK,CAAC;AAC1H,QAAI,UAAW,QAAO;AAAA,EAC1B;AACA,MAAI,IAAI,gBAAgB;AACpB,UAAM,YAAY,IAAI,KAAK,MAAM,KAAK,OAAK,kBAAkB,CAAC,MAAM,IAAI,cAAc;AACtF,QAAI,UAAW,QAAO;AAAA,EAC1B;AACA,MAAI,IAAI,eAAe;AACnB,WAAO,IAAI,KAAK,MAAM,KAAK,OAAK,iBAAiB,CAAC,MAAM,IAAI,aAAa;AAAA,EAC7E;AACA,SAAO;AACX;AAEA,SAAS,kBAAkB,MAA8C;AACrE,SAAO,WAAY,KAAa,SAAS,KAClC,WAAY,KAAa,UAAU,KACnC,WAAY,KAAa,SAAS,EAAE,KACpC,WAAY,KAAa,SAAS,SAAS,KAC3C,WAAY,KAAa,WAAW,SAAS,KAC7C,WAAY,KAAa,YAAY,UAAU,KAC/C,WAAY,KAAa,WAAW,SAAS,EAAE,KAC/C,WAAY,KAAa,WAAW,SAAS,SAAS,KACtD,WAAY,KAAa,YAAY,SAAS,EAAE,KAChD,WAAY,KAAa,YAAY,SAAS,UAAU;AACnE;AAEA,SAAS,iBAAiB,MAA8C;AACpE,SAAO,WAAW,KAAK,QAAQ,KACxB,WAAY,KAAa,SAAS,KAClC,WAAY,KAAa,SAAS,QAAQ,KAC1C,WAAY,KAAa,SAAS,SAAS,KAC3C,WAAY,KAAa,WAAW,QAAQ,KAC5C,WAAY,KAAa,YAAY,SAAS,KAC9C,WAAY,KAAa,WAAW,SAAS,QAAQ,KACrD,WAAY,KAAa,WAAW,SAAS,SAAS,KACtD,WAAY,KAAa,YAAY,SAAS,QAAQ,KACtD,WAAY,KAAa,YAAY,SAAS,SAAS;AAClE;AAEA,SAAS,kBAAkB,OAAoC;AAC3D,QAAM,WAAW,WAAW,KAAK;AACjC,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAAS,YAAY,EAAE,QAAQ,OAAO,EAAE;AACnD;AAEA,SAAS,iBAAiB,MAA8C;AACpE,SAAO,WAAY,KAAa,QAAQ,KACjC,WAAY,KAAa,IAAI,KAC7B,WAAY,KAAa,eAAe,KACxC,WAAY,KAAa,gBAAgB,KACzC,WAAY,KAAa,SAAS,QAAQ,KAC1C,WAAY,KAAa,SAAS,IAAI,KACtC,WAAY,KAAa,WAAW,QAAQ,KAC5C,WAAY,KAAa,YAAY,QAAQ,KAC7C,WAAY,KAAa,WAAW,SAAS,QAAQ,KACrD,WAAY,KAAa,YAAY,SAAS,QAAQ;AACjE;AAEA,SAAS,2BAA2B,MAA8C;AAC9E,SAAO,WAAY,KAAa,WAAW,KACpC,WAAY,KAAa,YAAY,KACrC,WAAY,KAAa,YAAY,KACrC,WAAY,KAAa,aAAa,KACtC,WAAY,KAAa,eAAe,KACxC,WAAY,KAAa,gBAAgB,KACzC,WAAY,KAAa,KAAK,KAC9B,WAAY,KAAa,SAAS,IAAI,KACtC,WAAY,KAAa,SAAS,WAAW,KAC7C,WAAY,KAAa,SAAS,YAAY,KAC9C,WAAY,KAAa,WAAW,WAAW,KAC/C,WAAY,KAAa,YAAY,YAAY,KACjD,WAAY,KAAa,WAAW,SAAS,IAAI,KACjD,WAAY,KAAa,YAAY,SAAS,IAAI,KAClD,iBAAiB,IAAI;AAChC;AAEA,SAAS,wBAAwB,OAA+C;AAC5E,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,EAAE,CAAC,SAAI,MAAM,MAAM,EAAE,CAAC,KAAK;AAC5E;AAEA,SAAS,qBAAqB,UAAoB,OAAe,OAAiC;AAC9F,QAAM,UAAU,wBAAwB,KAAK;AAC7C,MAAI,QAAS,UAAS,KAAK,GAAG,KAAK,IAAI,OAAO,EAAE;AACpD;AAEA,SAAS,yBAAyB,KAAkB,MAAmD;AACnG,QAAM,YAAY,kBAAkB,IAAI;AACxC,QAAM,WAAW,iBAAiB,IAAI;AACtC,QAAM,WAAW,iBAAiB,IAAI;AACtC,QAAM,cAAc,2BAA2B,IAAI;AACnD,QAAM,sBAAsB,WAAW,IAAI,mBAAmB;AAC9D,QAAM,cAAc,wBAAwB,KAAK,IAAI;AACrD,QAAM,kBAAkB;AAAA,IACpB,kBAAkB,QAAQ,KACvB,kBAAkB,mBAAmB,KACrC,kBAAkB,QAAQ,MAAM,kBAAkB,mBAAmB;AAAA,EAC5E;AACA,QAAM,cAAc,eAAe;AACnC,QAAM,WAAqB,CAAC;AAC5B,uBAAqB,UAAU,eAAe,WAAW;AACzD,uBAAqB,UAAU,YAAY,QAAQ;AACnD,uBAAqB,UAAU,aAAa,SAAS;AACrD,uBAAqB,UAAU,YAAY,QAAQ;AACnD,QAAM,WAAW,cAAc,iBAAkB,SAAS,SAAS,IAAI,iBAAiB;AACxF,QAAM,iBAAiB,cAChB,cAAc,6CAA6C,iCAC5D,SAAS,SAAS,IACd,oEAAoE,SAAS,KAAK,IAAI,CAAC,MACvF;AACV,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,eAAe,YAAY,YAAY;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACtB;AACJ;AAEA,SAAS,kBAAkB,KAAkB,MAAmC;AAC5E,QAAM,YAAY,kBAAkB,IAAI;AACxC,QAAM,WAAW,iBAAiB,IAAI;AACtC,SAAO;AAAA,IACF,IAAI,kBAAkB,cAAc,IAAI,kBACrC,IAAI,iBAAiB,aAAa,IAAI;AAAA,EAC9C;AACJ;AAEA,SAAS,mBAAmB,KAAkB,MAA0D;AACpG,QAAM,mBAAmB,WAAW,KAAK,gBAAgB,KAAK,WAAY,KAAa,mBAAmB;AAC1G,MAAI,CAAC,iBAAkB,QAAO;AAC9B,SAAO,IAAI,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,oBAAqB,EAAU,WAAW,oBAAqB,EAAU,YAAY,gBAAgB;AAClJ;AAEA,SAAS,wBAAwB,KAAkB,MAAmC;AAClF,MAAI,kBAAkB,KAAK,IAAI,EAAG,QAAO;AAKzC,MAAI,KAAK,oBAAoB,MAAM;AAC/B,UAAM,aAAa,mBAAmB,KAAK,IAAI;AAC/C,QAAI,cAAc,kBAAkB,KAAK,UAAU,EAAG,QAAO;AAAA,EACjE;AAEA,SAAO;AACX;AAEA,SAAS,oBAAoB,QAAgB,kBAAkC;AAC3E,SAAO,GAAG,MAAM,IAAI,gBAAgB;AACxC;AAEA,SAAS,wBAAwB,QAAqB;AAClD,MAAI,OAAO,QAAQ,uBAAuB,SAAU,QAAO,OAAO;AAClE,QAAM,OAAO,CAAC,UAAU,YAAY,aAAa,WAAW,SAAS;AACrE,QAAM,UAAU,KAAK,OAAO,CAAC,KAAK,QAAQ,OAAO,OAAO,SAAS,OAAO,SAAS,GAAG,CAAC,CAAC,IAAI,OAAO,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC;AACrH,QAAM,YAAY,MAAM,QAAQ,QAAQ,aAAa,IAAI,OAAO,cAAc,SAAU,QAAQ,eAAe,IAAI;AACnH,SAAO,UAAU;AACrB;AAEA,SAAS,iBAAiB,QAAsB;AAC5C,MAAI,OAAO,QAAQ,YAAY,UAAW,QAAO,OAAO;AACxD,MAAI,OAAO,QAAQ,UAAU,UAAW,QAAO,OAAO;AACtD,SAAO,wBAAwB,MAAM,IAAI;AAC7C;AAEA,SAAS,iBAAiB,MAAiD;AACvE,QAAM,MAAM,MAAM,QAAS,KAAa,YAAY,IAC7C,KAAa,eACd,MAAM,QAAS,KAAK,QAAgB,YAAY,IAC3C,KAAK,OAAe,eACrB,CAAC;AAEX,SAAO,IACF,IAAI,CAAC,WAAgB;AAAA,IAClB,OAAO,OAAO,OAAO,UAAU,WAAW,MAAM,MAAM,KAAK,IAAI;AAAA,IAC/D,WAAW,OAAO,OAAO,cAAc,WAAW,MAAM,UAAU,KAAK,IAAI;AAAA,EAC/E,EAAE,EACD,OAAO,CAAC,UAA+B,QAAQ,MAAM,SAAS,MAAM,SAAS,CAAC;AACvF;AAEA,SAAS,2BAA2B,MAA2B,QAAsC;AACjG,QAAM,QAAQ,iBAAiB,MAAM;AACrC,SAAO;AAAA,IACH,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,WAAW,QAAQ,cAAc;AAAA,IACjC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,UAAU,QAAQ,YAAY;AAAA,IAC9B,gBAAgB,OAAO,QAAQ,mBAAmB,WAAW,OAAO,iBAAkB,QAAQ,WAAW,cAAc;AAAA,IACvH,mBAAmB,OAAO,SAAS,OAAO,QAAQ,iBAAiB,CAAC,IAAI,OAAO,OAAO,iBAAiB,IAAI;AAAA,IAC3G,oBAAoB,OAAO,QAAQ,uBAAuB,WAAW,OAAO,qBAAqB;AAAA,IACjG,OAAO,OAAO,SAAS,OAAO,QAAQ,KAAK,CAAC,IAAI,OAAO,OAAO,KAAK,IAAI;AAAA,IACvE,QAAQ,OAAO,SAAS,OAAO,QAAQ,MAAM,CAAC,IAAI,OAAO,OAAO,MAAM,IAAI;AAAA,IAC1E;AAAA,IACA,oBAAoB,wBAAwB,MAAM;AAAA,IAClD,MAAM,QAAQ,cAAc;AAAA,IAC5B,mBAAmB,QAAQ,eAAe;AAAA,IAC1C,GAAI,QAAQ,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,IAClD,GAAI,QAAQ,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,EACnD;AACJ;AAEA,eAAe,2BAA2B,KAAkB,MAAmE;AAC3H,QAAM,eAAe,iBAAiB,IAAI;AAC1C,MAAI,CAAC,aAAa,OAAQ,QAAO,CAAC;AAElC,QAAM,UAA0C,CAAC;AACjD,aAAW,QAAQ,cAAc;AAC7B,QAAI;AACA,YAAM,eAAe,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,WACxD,MAAO,IAAI,UAA6B,UAAU,KAAK,UAAU,KAAK,WAAW,OAAO,IAAI,IAC5F,MAAM,eAAe,KAAK,MAAM,cAAc,EAAE,WAAW,KAAK,WAAW,iBAAiB,KAAK,CAAC;AACxG,YAAM,SAAS,iBAAiB,YAAY;AAC5C,cAAQ,KAAK,2BAA2B,MAAM,MAAM,CAAC;AAAA,IACzD,SAAS,GAAQ;AACb,cAAQ,KAAK;AAAA,QACT,OAAO,KAAK;AAAA,QACZ,WAAW,KAAK;AAAA,QAChB,OAAO,GAAG,WAAW;AAAA,MACzB,CAAC;AAAA,IACL;AAAA,EACJ;AACA,SAAO;AACX;AAQA,SAAS,qBAAqB,QAA2B;AACrD,QAAM,MAAO,QAAgB;AAC7B,SAAO,MAAM,QAAQ,GAAG,IAClB,IAAI,IAAI,CAAC,SAAkB,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI,EAAE,EAAE,OAAO,OAAO,IACtF,CAAC;AACX;AAEA,SAAS,6BAA6B,QAAuC;AACzE,SAAQ,QAAgB,6BAA6B,WAAW,WAAW;AAC/E;AAEA,SAAS,+BAA+B,QAAwB;AAC5D,SAAO,SAAS,MAAM;AAC1B;AAEA,SAAS,uBAAuB,MAAmD;AAC/E,QAAM,mBAAmB,qBAAqB,KAAK,MAAM;AACzD,MAAI,iBAAiB,QAAQ;AACzB,WAAO;AAAA,MACH;AAAA,MACA,aAAa;AAAA,IACjB;AAAA,EACJ;AAEA,SAAO;AAAA,IACH;AAAA,IACA,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,sBAAsB,+BAA+B,KAAK,EAAE;AAAA,EAChE;AACJ;AAEA,eAAe,0BAA0B,KAAkB,MAA0C;AACjG,MAAI;AACA,UAAM,eAAe,MAAM,eAAe,KAAK,MAAM,uBAAuB,CAAC,CAAC;AAC9E,WAAO,8BAA8B,YAAY;AAAA,EACrD,QAAQ;AACJ,WAAO,CAAC;AAAA,EACZ;AACJ;AAEA,SAAS,YAAY,OAAgB,WAAW,GAAW;AACvD,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEA,SAAS,uBACL,MACA,MACA,QACA,OACA,oBACuB;AACvB,QAAM,gBAAgB,WAAW,KAAK,aAAa,KAAK;AACxD,QAAM,SAAS,WAAW,QAAQ,MAAM,KAAK,WAAW,KAAK,cAAc,KAAK;AAChF,QAAM,QAAQ,YAAY,QAAQ,KAAK;AACvC,QAAM,SAAS,YAAY,QAAQ,MAAM;AACzC,QAAM,WAAW,WAAW,QAAQ,QAAQ,KAAK;AACjD,QAAM,iBAAiB,WAAW,QAAQ,cAAc,MAAM,WAAW,cAAc;AACvF,QAAM,eAAe,QAAQ,iBAAiB,QAAS,MAAM,QAAQ,QAAQ,aAAa,KAAK,OAAO,cAAc,SAAS;AAC7H,QAAM,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK,oBAAoB;AAAA,IACrC,iBAAiB,WAAW;AAAA,EAChC;AAEA,MAAI,QAAQ,cAAc,MAAM;AAC5B,WAAO;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,gCAAgC,KAAK,EAAE;AAAA,IACrD;AAAA,EACJ;AAEA,MAAI,CAAC,QAAQ;AACT,WAAO;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,iBAAiB,KAAK,EAAE,wDAAwD,aAAa;AAAA,IAC3G;AAAA,EACJ;AAEA,MAAI,gBAAgB,SAAS,qBAAqB,GAAG;AACjD,WAAO;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ,eAAe,sBAAsB;AAAA,MAC7C,UAAU,wCAAwC,KAAK,EAAE;AAAA,IAC7D;AAAA,EACJ;AAEA,MAAI,WAAW,eAAe;AAC1B,QAAI,YAAY,mBAAmB,SAAS;AACxC,aAAO;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB,QAAQ;AAAA,QACR,UAAU,WAAW,aAAa,iGAAiG,KAAK,EAAE;AAAA,MAC9I;AAAA,IACJ;AACA,QAAI,QAAQ,KAAK,SAAS,GAAG;AACzB,aAAO;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB,QAAQ;AAAA,QACR,UAAU,SAAS,aAAa;AAAA,MACpC;AAAA,IACJ;AACA,WAAO;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU;AAAA,IACd;AAAA,EACJ;AAEA,MAAI,KAAK,iBAAiB;AACtB,WAAO;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,kCAAkC,KAAK,EAAE;AAAA,IACvD;AAAA,EACJ;AAEA,MAAI,YAAY,mBAAmB,SAAS;AACxC,WAAO;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,mBAAmB,MAAM,kGAAkG,aAAa;AAAA,IACtJ;AAAA,EACJ;AAEA,MAAI,CAAC,YAAY,QAAQ,KAAK,SAAS,GAAG;AACtC,WAAO;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,QAAQ,CAAC,WAAW,oCAAoC;AAAA,MACxD,UAAU,6BAA6B,MAAM,yBAAyB,aAAa;AAAA,IACvF;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,UAAU,4BAA4B,MAAM,UAAU,aAAa;AAAA,EACvE;AACJ;AAEA,SAAS,2BAA2B,OAAuC;AACvE,QAAM,YAAY,MACb,OAAO,UAAQ,MAAM,mBAAmB,qBAAqB,IAAI,EACjE,IAAI,WAAS;AAAA,IACV,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,QAAQ,KAAK,kBAAkB;AAAA,IAC/B,QAAQ,KAAK,kBAAkB;AAAA,IAC/B,QAAQ,KAAK,kBAAkB;AAAA,IAC/B,UAAU,KAAK,kBAAkB;AAAA,EACrC,EAAE;AAEN,SAAO;AAAA,IACH,eAAe,UAAU,SAAS;AAAA,IAClC,iBAAiB,UAAU;AAAA,IAC3B,qBAAqB,CAAC,kBAAkB,qCAAqC,kBAAkB,qBAAqB,eAAe;AAAA,IACnI;AAAA,EACJ;AACJ;AAEA,eAAe,eACX,KACA,MACA,SACA,OAAgC,CAAC,GACrB;AACZ,QAAM,cAAc,wBAAwB,KAAK,IAAI;AAErD,MAAI,IAAI,qBAAqB,gBAAgB,KAAK,YAAY,CAAC,aAAa;AACxE,WAAO,IAAI,UAAU,YAAY,KAAK,UAAU,SAAS,IAAI;AAAA,EACjE;AACA,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,WAAO,IAAI,UAAU,QAAQ,SAAS,IAAI;AAAA,EAC9C;AACA,QAAM,WAAW,yBAAyB,KAAK,IAAI;AACnD,QAAM,IAAI,MAAM,YAAY,OAAO,mDAAmD,KAAK,EAAE,eAAe,SAAS,YAAY,SAAS,yBAAyB,SAAS,uBAAuB,SAAS,iBAAiB,SAAS,WAAW,GAAG;AACxP;AAEA,SAAS,sCAAsC,OAAmB;AAC9D,QAAM,UAAU,qBAAqB,KAAK;AAC1C,QAAM,SAAS,MAAM,QAAQ,SAAS,MAAM,IACtC,QAAQ,SACR,MAAM,QAAQ,OAAO,MAAM,IACvB,MAAM,SACN,CAAC;AACX,SAAO,OAAO,OAAO,CAAC,UAAmB,SAAS,OAAO,UAAU,QAAQ;AAC/E;AAEA,SAAS,wCAAwC,OAAqC;AAClF,QAAM,gBAAgB,OAAO,iBAAiB,OAAO,MAAM,kBAAkB,WACvE,MAAM,gBACN,CAAC;AACP,SAAO;AAAA,IACH,OAAO,WAAW,OAAO,KAAK;AAAA,IAC9B,QAAQ,WAAW,OAAO,MAAM;AAAA,IAChC,QAAQ,WAAW,OAAO,MAAM,KAAK,WAAW,cAAc,UAAU;AAAA,IACxE,WAAW,WAAW,OAAO,SAAS,KAAK,WAAW,cAAc,SAAS;AAAA,IAC7E,iBAAiB,WAAW,cAAc,eAAe,KAAK,WAAW,cAAc,SAAS,KAAK,WAAW,cAAc,UAAU;AAAA,IACxI,cAAc,WAAW,cAAc,YAAY;AAAA,IACnD,mBAAmB,WAAW,cAAc,iBAAiB;AAAA,IAC7D,cAAc,WAAW,cAAc,YAAY,KAAK,WAAW,cAAc,OAAO;AAAA,IACxF,OAAO,WAAW,cAAc,KAAK;AAAA,IACrC,eAAe,WAAW,cAAc,aAAa;AAAA,IACrD,QAAQ,WAAW,cAAc,MAAM;AAAA,IACvC,gBAAgB,WAAW,cAAc,cAAc;AAAA,IACvD,WAAW,WAAW,cAAc,SAAS;AAAA,IAC7C,aAAa,WAAW,cAAc,WAAW;AAAA,IACjD,cAAc,WAAW,cAAc,YAAY;AAAA,IACnD,GAAI,cAAc,UAAU,OAAO,cAAc,WAAW,YAAY,CAAC,MAAM,QAAQ,cAAc,MAAM,IAAI,EAAE,QAAQ,cAAc,OAAO,IAAI,CAAC;AAAA,IACnJ,GAAI,cAAc,gBAAgB,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IAClE,GAAI,cAAc,oBAAoB,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAAA,IAC1E,GAAI,cAAc,oBAAoB,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAAA,IAC1E,GAAI,WAAW,cAAc,MAAM,IAAI,EAAE,QAAQ,WAAW,cAAc,MAAM,EAAE,IAAI,CAAC;AAAA,IACvF,GAAI,WAAW,cAAc,UAAU,IAAI,EAAE,YAAY,WAAW,cAAc,UAAU,EAAE,IAAI,CAAC;AAAA,IACnG,GAAI,WAAW,cAAc,aAAa,IAAI,EAAE,eAAe,WAAW,cAAc,aAAa,EAAE,IAAI,CAAC;AAAA,IAC5G,GAAI,WAAW,cAAc,MAAM,IAAI,EAAE,QAAQ,WAAW,cAAc,MAAM,EAAE,IAAI,CAAC;AAAA,EAC3F;AACJ;AAEA,eAAe,8BACX,KACA,MACc;AACd,QAAM,mBAAmB,MAAM,SAAS,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI;AACzE,QAAM,qBAAqB,CAAC,UAAe,WAAW,OAAO,MAAM,MAAM,IAAI,KAAK;AAElF,MAAI,IAAI,qBAAqB,cAAc;AACvC,UAAM,iBAAwB,CAAC;AAE/B,QAAI;AACA,qBAAe;AAAA,QACX,GAAG,sCAAsC,MAAM,IAAI,UAAU,QAAQ,2BAA2B,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAQ,EAC1H,OAAO,kBAAkB;AAAA,MAClC;AAAA,IACJ,QAAQ;AAAA,IAER;AAEA,eAAW,QAAQ,IAAI,KAAK,OAAO;AAC/B,UAAI,CAAC,KAAK,YAAY,wBAAwB,KAAK,IAAI,EAAG;AAC1D,UAAI,oBAAoB,CAAC,iBAAiB,IAAI,KAAK,EAAE,EAAG;AAExD,UAAI;AACA,cAAM,eAAe;AAAA,UACjB,MAAM,IAAI,UAAU,YAAY,KAAK,UAAU,2BAA2B,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC;AAAA,QACrG,EAAE,OAAO,kBAAkB;AAC3B,YAAI,aAAa,WAAW,EAAG;AAE/B,mBAAW,SAAS,cAAc;AAC9B,gBAAM,UAAU,wCAAwC,KAAK;AAC7D,cAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,OAAQ;AACvC,gBAAM,IAAI,UAAU,QAAQ,sBAAsB,OAAO;AAAA,QAC7D;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,IACJ;AAEA,QAAI;AACA,qBAAe;AAAA,QACX,GAAG,sCAAsC,MAAM,IAAI,UAAU,QAAQ,2BAA2B,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAQ,EAC1H,OAAO,kBAAkB;AAAA,MAClC;AAAA,IACJ,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACX;AAEA,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,eAAQ,sDAAkC,IAAI,KAAK,EAAE,EAAY,OAAO,kBAAkB;AAAA,EAC9F;AAEA,SAAO,CAAC;AACZ;AAEA,SAAS,+BAA+B,OAAyB;AAC7D,aAAO,+CAA2B,KAAK;AAC3C;AAEA,SAAS,oBAAoB,KAAkB,QAAgB,oBAAsD;AACjH,SAAO;AAAA,IACH,QAAQ,IAAI,KAAK;AAAA,IACjB;AAAA,IACA,GAAI,qBAAqB,EAAE,mBAAmB,IAAI,CAAC;AAAA,IACnD,YAAY,IAAI;AAAA,EACpB;AACJ;AAIO,IAAM,mBAAmB;AAAA,EAC5B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,gBAAgB,EAAE,MAAM,UAAU,aAAa,wDAAwD;AAAA,IAC3G;AAAA,EACJ;AACJ;AAEO,IAAM,uBAAuB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,gBAAgB,EAAE,MAAM,UAAU,aAAa,wDAAwD;AAAA,IAC3G;AAAA,EACJ;AACJ;AAEO,IAAM,yBAAyB;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,sCAAsC;AAAA,MAC9E,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,eAAe,cAAc,uBAAuB,cAAc,aAAa,GAAG,aAAa,sIAAsI;AAAA,MACzQ,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,eAAe,cAAc,uBAAuB,cAAc,aAAa,GAAG,aAAa,iCAAiC;AAAA,IACvK;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,uBAAuB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,QAAQ;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,aAAa;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,QACF,MAAM;AAAA,QACN,MAAM,CAAC,OAAO,UAAU,YAAY;AAAA,QACpC,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AACJ;AAEO,IAAM,yBAAyB;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MACnE,QAAQ,EAAE,MAAM,UAAU,aAAa,qDAAqD;AAAA,IAChG;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,0BAA0B;AAAA,EACnC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,MACpE,QAAQ,EAAE,MAAM,UAAU,aAAa,mDAAmD;AAAA,MAC1F,gBAAgB,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,MACtF,mBAAmB,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,MACpG,mBAAmB,EAAE,MAAM,WAAW,aAAa,yDAAyD;AAAA,MAC5G,qBAAqB,EAAE,MAAM,WAAW,aAAa,sIAAsI;AAAA,IAC/L;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,sBAAsB;AAAA,EAC/B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,MACjF,YAAY,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,MAClF,SAAS,EAAE,MAAM,UAAU,aAAa,8CAA8C;AAAA,MACtF,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,eAAe,cAAc,uBAAuB,cAAc,aAAa,GAAG,aAAa,6JAA6J;AAAA,MAChS,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,eAAe,cAAc,uBAAuB,cAAc,aAAa,GAAG,aAAa,iCAAiC;AAAA,IACvK;AAAA,IACA,UAAU,CAAC,WAAW,cAAc,SAAS;AAAA,EACjD;AACJ;AAEO,IAAM,sBAAsB;AAAA,EAC/B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,MAC1D,YAAY,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,MAC5E,qBAAqB,EAAE,MAAM,UAAU,aAAa,kEAAkE;AAAA,MACtH,MAAM,EAAE,MAAM,UAAU,aAAa,qDAAqD;AAAA,MAC1F,SAAS,EAAE,MAAM,WAAW,aAAa,6NAA6N;AAAA,IAC1Q;AAAA,IACA,UAAU,CAAC,WAAW,YAAY;AAAA,EACtC;AACJ;AAEO,IAAM,uBAAuB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,MAC1D,YAAY,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,MACxE,qBAAqB,EAAE,MAAM,UAAU,aAAa,yEAAyE;AAAA,MAC7H,MAAM,EAAE,MAAM,UAAU,aAAa,8DAA8D;AAAA,MACnG,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,eAAe,QAAQ,GAAG,aAAa,+GAA+G;AAAA,IAC7L;AAAA,IACA,UAAU,CAAC,WAAW,YAAY;AAAA,EACtC;AACJ;AAEO,IAAM,2BAA2B;AAAA,EACpC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,MAC1D,MAAM,EAAE,MAAM,UAAU,aAAa,sMAAsM;AAAA,IAC/O;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,uBAAuB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,IAC9D;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,8BAA8B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,MAC1D,QAAQ,EAAE,MAAM,UAAU,aAAa,oGAAqG;AAAA,MAC5I,SAAS,EAAE,MAAM,WAAW,aAAa,sFAAsF;AAAA,MAC/H,SAAS,EAAE,MAAM,WAAW,aAAa,mFAAmF;AAAA,MAC5H,mBAAmB,EAAE,MAAM,WAAW,aAAa,sIAAsI;AAAA,IAC7L;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,uBAAuB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,MAC1D,SAAS,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,IACzE;AAAA,IACA,UAAU,CAAC,WAAW,SAAS;AAAA,EACnC;AACJ;AAEO,IAAM,oBAAoB;AAAA,EAC7B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,MAC1D,YAAY,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,MACrF,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,QAAQ,GAAG,aAAa,kBAAkB;AAAA,IAC1F;AAAA,IACA,UAAU,CAAC,WAAW,cAAc,QAAQ;AAAA,EAChD;AACJ;AAEO,IAAM,uBAAuB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EAEb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,gBAAgB,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,MAC/F,QAAQ,EAAE,MAAM,UAAU,aAAa,gEAAgE;AAAA,MACvG,aAAa,EAAE,MAAM,UAAU,aAAa,yDAAyD;AAAA,IACzG;AAAA,IACA,UAAU,CAAC,kBAAkB,QAAQ;AAAA,EACzC;AACJ;AAEO,IAAM,wBAAwB;AAAA,EACjC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,MAC7D,sBAAsB;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,CAAC,YAAY,QAAQ,kBAAkB,iBAAiB;AAAA,QAC9D,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,6BAA6B;AAAA,EACtC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,qEAAqE;AAAA,MAC7G,MAAM;AAAA,QACF,MAAM;AAAA,QACN,MAAM,CAAC,YAAY,QAAQ,kBAAkB,iBAAiB;AAAA,QAC9D,aAAa;AAAA,MACjB;AAAA,MACA,aAAa;AAAA,QACT,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,aAAa;AAAA,MACjB;AAAA,MACA,SAAS,EAAE,MAAM,WAAW,aAAa,2FAA2F;AAAA,IACxI;AAAA,IACA,UAAU,CAAC,WAAW,MAAM;AAAA,EAChC;AACJ;AAEO,IAAM,yBAAyB;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,MAAM,EAAE,MAAM,UAAU,aAAa,oDAAoD;AAAA,MACzF,MAAM,EAAE,MAAM,UAAU,aAAa,0KAA0K;AAAA,IACnN;AAAA,EACJ;AACJ;AAEO,IAAM,6BAA6B;AAAA,EACtC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,0DAA0D;AAAA,MAC7H,OAAO,EAAE,MAAM,UAAU,aAAa,8EAA8E;AAAA,MACpH,UAAU,EAAE,MAAM,UAAU,aAAa,8FAA8F;AAAA,MACvI,OAAO,EAAE,MAAM,UAAU,aAAa,0DAA0D;AAAA,MAChG,gBAAgB,EAAE,MAAM,WAAW,aAAa,yFAAyF;AAAA,IAC7I;AAAA,EACJ;AACJ;AAEO,IAAM,wBAAwB;AAAA,EACjC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,8DAA8D;AAAA,IAC1G;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,iCAAiC;AAAA,EAC1C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa,EAAE,MAAM,UAAmB,YAAY,CAAC,EAAE;AAC3D;AAEO,IAAM,mCAAmC;AAAA,EAC5C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,iGAAiG;AAAA,MACzI,QAAQ,EAAE,MAAM,UAAU,aAAa,8EAA8E;AAAA,IACzH;AAAA,EACJ;AACJ;AAEO,IAAM,kCAAkC;AAAA,EAC3C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,iFAAiF;AAAA,IAC7H;AAAA,EACJ;AACJ;AAEO,IAAM,wBAAwB;AAAA,EACjC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,MACR,SAAS,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,IACpF;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACxB;AACJ;AAEO,IAAM,iBAAiB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAIA,eAAsB,WAAW,KAAmC;AAChE,QAAM,sBAAsB,GAAG;AAC/B,QAAM,EAAE,MAAM,UAAU,IAAI;AAC5B,QAAM,UAAiB,CAAC;AAExB,QAAM,oBAAgB,qCAAiB,KAAK,EAAE;AAE9C,aAAW,QAAQ,KAAK,OAAO;AAC3B,UAAM,QAAa;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,SAAS,yBAAyB,KAAK,IAAI;AAAA,MAC3C,UAAU,iBAAiB,IAAI;AAAA,MAC/B,WAAW,kBAAkB,IAAI;AAAA,MACjC,GAAG,uBAAuB,IAAI;AAAA,IAClC;AAEA,QAAI;AACA,UAAI,CAAC,iBAAiB,SAAS,KAAK,KAAK,UAAU;AAC/C,cAAM,SAAS,MAAO,UAA6B,UAAU,KAAK,UAAU,KAAK,WAAW,OAAO,IAAI;AACvG,cAAM,SAAS,iBAAiB,MAAM;AACtC,cAAM,qBAAqB,wBAAwB,MAAM;AACzD,cAAM,QAAQ,iBAAiB,MAAM;AACrC,cAAM,SAAS,QAAQ,YAAa,QAAQ,UAAU,WAAY;AAClE,8BAAsB,OAAO,MAAM;AACnC,cAAM,SAAS,QAAQ;AACvB,cAAM,UAAU;AAChB,cAAM,qBAAqB;AAC3B,cAAM,oBAAoB,uBAAuB,MAAM,MAAM,QAAQ,OAAO,kBAAkB;AAE9F,cAAM,aAAa,kBAAkB,QAAS,KAAK,QAAgB,wBAAwB,CAAC,CAAC;AAC7F,YAAI,cAAc,WAAW,KAAK,CAAC,MAAW,GAAG,SAAS,GAAG;AACzD,gBAAM,mBAAmB;AACzB,gBAAM,sBAAsB,WAAW,OAAO,CAAC,MAAW,GAAG,SAAS,EAAE,IAAI,CAAC,MAAW,EAAE,IAAI;AAAA,QAClG;AAAA,MACJ,WAAW,iBAAiB,SAAS,GAAG;AACpC,cAAM,eAAgB,KAAK,QAAgB,2BAA2B;AACtE,cAAM,eAAe,MAAM,eAAe,KAAK,MAAM,cAAc;AAAA,UAC/D,WAAW,KAAK;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,UACnB,sBAAuB,KAAK,QAAgB,wBAAwB;AAAA,QACxE,CAAC;AACD,cAAM,SAAS,iBAAiB,YAAY;AAC5C,cAAM,qBAAqB,wBAAwB,MAAM;AACzD,cAAM,QAAQ,iBAAiB,MAAM;AACrC,cAAM,SAAS,QAAQ,YAAa,QAAQ,UAAU,WAAY;AAClE,8BAAsB,OAAO,MAAM;AACnC,cAAM,SAAS,QAAQ;AACvB,cAAM,UAAU;AAChB,cAAM,qBAAqB;AAC3B,cAAM,oBAAoB,uBAAuB,MAAM,MAAM,QAAQ,OAAO,kBAAkB;AAE9F,cAAM,aAAa,kBAAkB,cAAe,KAAK,QAAgB,wBAAwB,CAAC,CAAC;AACnG,YAAI,cAAc,WAAW,KAAK,CAAC,MAAW,GAAG,SAAS,GAAG;AACzD,gBAAM,mBAAmB;AACzB,gBAAM,sBAAsB,WAAW,OAAO,CAAC,MAAW,GAAG,SAAS,EAAE,IAAI,CAAC,MAAW,EAAE,IAAI;AAAA,QAClG;AAAA,MACJ,OAAO;AACH,cAAM,SAAS;AACf,cAAM,OAAO;AAAA,MACjB;AAAA,IACJ,SAAS,GAAQ;AACb,YAAM,UAAU,gCAAgC,GAAG;AAAA,QAC/C,SAAS;AAAA,QACT,gBAAgB,KAAK;AAAA,QACrB,QAAQ,KAAK;AAAA,MACjB,CAAC;AACD,YAAM,SAAS;AACf,YAAM,QAAQ,QAAQ;AACtB,YAAM,iBAAiB,QAAQ,cAAc,sBAAsB;AACnE,aAAO,OAAO,OAAO;AAAA,QACjB,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB,aAAa,QAAQ;AAAA,QACrB,kBAAkB,QAAQ;AAAA,QAC1B,YAAY,QAAQ;AAAA,QACpB,kBAAkB,QAAQ;AAAA,MAC9B,CAAC;AAAA,IACL;AAGA,UAAM,sBAAkB,8CAA0B,KAAK,IAAI,EAAE,QAAQ,KAAK,GAAG,CAAC;AAC9E,QAAI,gBAAgB,0BAA0B,GAAG;AAC7C,YAAM,gBAAgB;AAAA,QAClB,qBAAqB,gBAAgB;AAAA,QACrC,iBAAiB,gBAAgB;AAAA,QACjC,QAAQ,gBAAgB;AAAA,QACxB,kBAAkB,gBAAgB;AAAA,MACtC;AAAA,IACJ;AAEA,UAAM,sBAAsB,6BAA6B,KAAK,IAAI,KAAK,EAAE;AACzE,QAAI,uBAAuB,KAAK,iBAAiB;AAC7C,YAAM,SAAS;AACf,YAAM,iBAAiB;AACvB,YAAM,cAAc;AACpB,YAAM,sBAAsB,oBAAoB,QAAQ;AACxD,YAAM,uBAAuB,oBAAoB,SAAS;AAC1D,YAAM,oBAAoB;AAAA,IAC9B;AAEA,UAAM,gBAA0B,CAAC;AACjC,QAAI,MAAM,mBAAmB,0BAA0B;AACnD,oBAAc,KAAK,uCAAuC,KAAK,EAAE,gDAAgD;AACjH,oBAAc,KAAK,6FAA6F,KAAK,EAAE,KAAK;AAAA,IAChI,WAAW,MAAM,WAAW,YAAY,KAAK,iBAAiB;AAC1D,oBAAc,KAAK,yDAAyD,KAAK,EAAE,IAAI;AAAA,IAC3F,WAAW,MAAM,WAAW,SAAS;AACjC,oBAAc,KAAK,gDAAgD,KAAK,EAAE,oBAAoB;AAAA,IAClG,WAAW,MAAM,WAAW,cAAc,MAAM,OAAO,SAAS,KAAK,GAAG;AACpE,oBAAc,KAAK,oDAAoD;AAAA,IAC3E;AAEA,QAAI,MAAM,mBAAmB,qBAAqB,QAAQ,MAAM,kBAAkB,UAAU;AACxF,oBAAc,KAAK,OAAO,MAAM,kBAAkB,QAAQ,CAAC;AAAA,IAC/D;AAEA,QAAI,gBAAgB,0BAA0B,GAAG;AAC7C,UAAI,gBAAgB,kBAAkB;AAClC,sBAAc,KAAK,oDAAoD;AAAA,MAC3E,OAAO;AACH,sBAAc,KAAK,gDAAgD;AAAA,MACvE;AAAA,IACJ;AAEA,QAAI,cAAc,SAAS,GAAG;AAC1B,YAAM,gBAAgB;AAAA,IAC1B;AAEA,UAAM,eAAe,MAAM,2BAA2B,KAAK,IAAI;AAC/D,QAAI,aAAa,OAAQ,OAAM,eAAe;AAE9C,UAAM,eAAe,MAAM,0BAA0B,KAAK,IAAI;AAC9D,QAAI,aAAa,SAAS,GAAG;AACzB,YAAM,WAAW;AAAA,IACrB;AAEA,YAAQ,KAAK,KAAK;AAAA,EACtB;AAEA,QAAM,yBAAqB,wCAAoB;AAAA,IAC3C,QAAQ,KAAK;AAAA,IACb,WAAO,6BAAS,KAAK,EAAE;AAAA,IACvB,mBAAe,sCAAkB,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IACvD,OAAO;AAAA,EACX,CAAC;AAED,QAAM,WAAoC;AAAA,IACtC,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,cAAc,KAAK;AAAA,IACnB,QAAQ,KAAK;AAAA,IACb,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,eAAe;AAAA,MACX,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,wBAAwB,CAAC,iBAAiB,eAAe;AAAA,IAC7D;AAAA,IACA,OAAO;AAAA,IACP,YAAY,mBAAmB;AAAA,IAC/B,iBAAiB,mBAAmB;AAAA,IACpC,oBAAoB,mBAAmB;AAAA,IACvC,mBAAmB,mBAAmB;AAAA,IACtC,0BAA0B,2BAA2B,OAAO;AAAA,EAChE;AAGA,MAAI;AACA,aAAS,gBAAgB;AAAA,EAC7B,QAAQ;AAAA,EAAmC;AAE3C,MAAI;AACA,UAAM,gBAAgB,MAAM,8BAA8B,GAAG;AAC7D,QAAI,cAAc,SAAS,GAAG;AAC1B,eAAS,2BAA2B;AAAA,IACxC;AAAA,EACJ,QAAQ;AAAA,EAER;AAEA,SAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAC3C;AAEA,eAAsB,gBAClB,KACA,MACe;AACf,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,gBAAgB,MAAM,8BAA8B,GAAG;AAC7D,QAAM,OAAO,OAAO,KAAK,SAAS,YAAY,KAAK,OAAO,IAAI,KAAK,OAAO;AAC1E,QAAM,OAAO,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAQ,IAAI;AAC7F,QAAM,cAAU,sCAAkB,KAAK,IAAI,EAAE,MAAM,KAAK,CAAC;AACzD,QAAM,cAAU,qCAAiB,KAAK,EAAE;AACxC,SAAO,KAAK,UAAU;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA,GAAI,cAAc,SAAS,IAAI,EAAE,0BAA0B,cAAc,IAAI,CAAC;AAAA,EAClF,GAAG,MAAM,CAAC;AACd;AAEA,eAAsB,oBAClB,KACA,MACe;AACf,QAAM,sBAAsB,GAAG;AAC/B,QAAM,mBAAmB,MAAM,QAAQ,KAAK,QAAQ,IAC9C,IAAI,IAAI,KAAK,SAAS,IAAI,QAAM,OAAO,OAAO,WAAW,GAAG,KAAK,IAAI,EAAE,EAAE,OAAO,OAAO,CAAC,IACxF;AACN,QAAM,QAAQ,IAAI,KAAK,MAAM,OAAO,UAAQ,CAAC,oBAAoB,iBAAiB,IAAI,KAAK,EAAE,CAAC;AAC9F,QAAM,WAAkB,CAAC;AACzB,QAAM,eAAe,KAAK,mBAAmB;AAC7C,QAAM,YAAY;AAAA,IACd,QAAQ,IAAI,KAAK;AAAA,IACjB,GAAI,OAAO,KAAK,UAAU,WAAW,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC9D,GAAI,OAAO,KAAK,aAAa,YAAY,KAAK,SAAS,KAAK,IAAI,EAAE,SAAS,KAAK,SAAS,KAAK,EAAE,IAAI,CAAC;AAAA,IACrG,GAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,IAAI,EAAE,OAAO,KAAK,MAAM,KAAK,EAAE,IAAI,CAAC;AAAA,EAC9F;AAEA,aAAW,QAAQ,OAAO;AACtB,QAAI;AACA,UAAI,wBAAwB,KAAK,IAAI,KAAK,CAAC,KAAK,UAAU;AACtD,cAAMA,aAAQ,oCAAgB,IAAI,KAAK,IAAI,SAAS;AACpD,iBAAS,SAAK,mDAA+B;AAAA,UACzC,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,UACf,WAAW;AAAA,UACX,OAAAA;AAAA,UACA,QAAQ;AAAA,QACZ,CAAC,CAAC;AACF;AAAA,MACJ;AAEA,YAAM,SAAS,MAAM,eAAe,KAAK,MAAM,yBAAyB,SAAS;AACjF,YAAM,UAAU,qBAAqB,MAAM;AAC3C,UAAI,SAAS,YAAY,OAAO;AAC5B,cAAM,IAAI,MAAM,QAAQ,SAAS,qCAAqC;AAAA,MAC1E;AACA,YAAM,QAAQ,SAAS,SAAS;AAChC,UAAI,OAAO,aAAa,iCAAiC,CAAC,MAAM,QAAQ,MAAM,OAAO,GAAG;AACpF,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC5E;AACA,YAAM,eAAe,mBACf,8CAA0B,IAAI,KAAK,IAAI,MAAM,OAAO,IACpD,EAAE,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,SAAS,CAAC,EAAE;AAC1E,eAAS,SAAK,mDAA+B;AAAA,QACzC,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACJ,CAAC,CAAC;AACF,UAAI,gBAAgB,aAAa,WAAW,GAAG;AAC3C,kDAAkB,IAAI,KAAK,IAAI;AAAA,UAC3B,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,YACL,UAAU;AAAA,YACV,UAAU,aAAa;AAAA,YACvB,kBAAkB,aAAa;AAAA,YAC/B,iBAAiB,aAAa;AAAA,YAC9B,aAAa,MAAM,QAAQ,eAAe;AAAA,YAC1C,KAAK;AAAA,UACT;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ,SAAS,GAAQ;AACb,eAAS,SAAK,mDAA+B;AAAA,QACzC,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW,KAAK,WAAW,oBAAoB;AAAA,QAC/C,QAAQ;AAAA,QACR,OAAO,GAAG,WAAW,OAAO,CAAC;AAAA,MACjC,CAAC,CAAC;AAAA,IACN;AAAA,EACJ;AAEA,QAAM,eAAW,0DAAsC,IAAI,KAAK,IAAI,QAAQ;AAC5E,4CAAkB,IAAI,KAAK,IAAI;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,MACL,UAAU,SAAS;AAAA,MACnB,eAAe,SAAS;AAAA,MACxB,QAAQ,SAAS;AAAA,MACjB,aAAa,SAAS;AAAA,IAC1B;AAAA,EACJ,CAAC;AACD,SAAO,KAAK,UAAU,EAAE,SAAS,MAAM,SAAS,GAAG,MAAM,CAAC;AAC9D;AAEA,eAAsB,cAAc,KAAmC;AACnE,QAAM,sBAAsB,GAAG;AAC/B,QAAM,EAAE,KAAK,IAAI;AACjB,SAAO,KAAK,UAAU;AAAA,IAClB,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,OAAO,KAAK,MAAM,IAAI,QAAM;AAAA,MACxB,QAAQ,EAAE;AAAA,MACV,WAAW,EAAE;AAAA,MACb,UAAU,EAAE;AAAA,MACZ,UAAU,iBAAiB,CAAC;AAAA,MAC5B,WAAW,kBAAkB,CAAC;AAAA,MAC9B,SAAS,yBAAyB,KAAK,CAAC;AAAA,MACxC,iBAAiB,EAAE;AAAA,MACnB,QAAQ,EAAE;AAAA,MACV,cAAc,iBAAiB,CAAC;AAAA,MAChC,GAAG,uBAAuB,CAAC;AAAA,MAC3B,eAAe,EAAE;AAAA,IACrB,EAAE;AAAA,EACN,GAAG,MAAM,CAAC;AACd;AAEA,eAAsB,gBAClB,KACA,MACe;AACf,QAAM,WAAW,WAAW,KAAK,SAAS,KAAK,WAAW,KAAK,QAAQ;AACvE,MAAI;AACA,UAAM,WAAO,gCAAY,IAAI,KAAK,IAAI,KAAK,SAAS,EAAE,SAAS,CAAC;AAGhE,QAAI,iBAAiB,IAAI,SAAS,KAAK,EAAE,IAAI,qBAAqB,eAAe;AAC7E,UAAI,UAAU,QAAQ,sBAAsB,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACnF,aAAO,KAAK,UAAU,EAAE,SAAS,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AAAA,IAC3H;AAMA,QAAI,IAAI,qBAAqB,cAAc;AAEvC,UAAI,UAAU,QAAQ,sBAAsB,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAGnF,YAAM,mBAAoC,CAAC;AAC3C,iBAAW,QAAQ,IAAI,KAAK,OAAO;AAC/B,cAAM,cAAc,wBAAwB,KAAK,IAAI;AACrD,YAAI,eAAe,CAAC,KAAK,SAAU;AAEnC,yBAAiB;AAAA,UACb,yBAAyB,KAAK,MAAM,EAAE,SAAS,KAAK,QAAQ,CAAC,EACxD,KAAK,YAAU;AACZ,gBAAI,OAAO,SAAS;AAChB,kBAAI;AACA,sBAAM,eAAe,OAAO;AAC5B,sBAAM,aAAa,qBAAqB,KAAK,OAAO;AACpD,0DAAkB,IAAI,KAAK,IAAI;AAAA,kBAC3B,MAAM;AAAA,kBACN,QAAQ,KAAK;AAAA,kBACb,WAAW,OAAO;AAAA,kBAClB;AAAA,kBACA,SAAS;AAAA,oBACL,QAAQ;AAAA,oBACR,KAAK;AAAA,oBACL,QAAQ,KAAK;AAAA,oBACb,SAAS,KAAK;AAAA,oBACd,WAAW,WAAW;AAAA,oBACtB,aAAa,WAAW;AAAA,oBACxB,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,oBACnD,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,oBACvC,iBAAiB,OAAO;AAAA,kBAC5B;AAAA,gBACJ,CAAC;AAAA,cACL,QAAQ;AAAA,cAAoB;AAAA,YAChC;AAAA,UACJ,CAAC,EACA,MAAM,MAAM;AAAA,UAAkD,CAAC;AAAA,QACxE;AAAA,MACJ;AAEA,cAAQ,IAAI,gBAAgB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAE5C,aAAO,KAAK,UAAU,EAAE,SAAS,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AAAA,IAC3H;AAGA,WAAO,KAAK,UAAU,EAAE,SAAS,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AAAA,EAC3H,SAAS,GAAQ;AACb,UAAM,UAAU,GAAG,WAAW,OAAO,CAAC;AACtC,QAAI,QAAQ,SAAS,yCAAyC,GAAG;AAC7D,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,MAAM,2CAA2C,UAAU,OAAO,QAAQ,CAAC;AAAA,IACvH;AACA,WAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,QAAQ,CAAC;AAAA,EAC5D;AACJ;AAEA,eAAsB,cAClB,KACA,MACe;AACf,MAAI;AACA,UAAM,sBAAsB,GAAG;AAC/B,UAAM,eAAe,0BAA0B,KAAK,MAAM;AAC1D,UAAM,OAAO,uBAAuB,KAAK,IAAI;AAC7C,UAAM,YAAY,0BAA0B,2BAAuB,6BAAS,IAAI,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC;AACnG,UAAM,QAAQ,mBAAmB,WAAW,MAAM,YAAY;AAC9D,UAAM,UAAU,wBAAwB,SAAS;AACjD,UAAM,iBAAiB,wBAAwB,KAAK;AACpD,UAAM,cAAc,4BAA4B,SAAS;AACzD,UAAM,yBAAqB,wCAAoB;AAAA,MAC3C,QAAQ,IAAI,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,mBAAe,sCAAkB,IAAI,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,MAC3D,OAAO,IAAI,KAAK;AAAA,IACpB,CAAC;AACD,UAAM,qBAAsB,YAAoB,sBAAsB,CAAC;AACvE,UAAM,0BAA0B,MAAM,KAAK,CAAC,SAAc,0BAA0B,IAAI,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC;AACnH,WAAO,KAAK,UAAU;AAAA,MAClB,SAAS;AAAA,MACT,eAAe;AAAA,QACX,MAAM;AAAA,QACN,gBAAgB,CAAC,WAAW,UAAU;AAAA,QACtC,oBAAoB,CAAC,aAAa,UAAU,WAAW;AAAA,QACvD,OAAO;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,QACJ;AAAA,QACA,UAAU;AAAA,QACV,UAAU,QAAQ,cAAc,MAAM,KAAK,SAAS;AAAA,MACxD;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,YAAY,mBAAmB;AAAA,MAC/B,iBAAiB,mBAAmB;AAAA,MACpC,mBAAmB,mBAAmB;AAAA,MACtC;AAAA,MACA;AAAA,MACA,cAAe,QAAgB;AAAA,MAC/B,kBAAmB,QAAgB;AAAA,MACnC,aAAc,QAAgB;AAAA,MAC9B,iBAAkB,QAAgB;AAAA,MAClC,qBAAsB,eAAuB;AAAA,MAC7C,yBAA0B,eAAuB;AAAA,MACjD,oBAAqB,eAAuB;AAAA,MAC5C,wBAAyB,eAAuB;AAAA,MAChD;AAAA,MACA,oBAAqB,YAAoB;AAAA,MACzC,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,GAAI,SAAS,YAAY,cAAc,KAAK,YAAU,sBAAsB,IAAI,MAAM,CAAC,IAAI;AAAA,QACvF,aAAa,MAAM,OAAO,CAAC,SAAc,sBAAsB,IAAI,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC;AAAA,MAClG,IAAI,CAAC;AAAA,MACL,GAAI,SAAS,gBAAgB,0BAA0B;AAAA,QACnD,iBAAiB,MAAM,OAAO,CAAC,SAAc,0BAA0B,IAAI,OAAO,MAAM,UAAU,EAAE,CAAC,CAAC;AAAA,MAC1G,IAAI,CAAC;AAAA;AAAA,MAEL,kBAAkB;AAAA,IACtB,GAAG,MAAM,CAAC;AAAA,EACd,SAAS,GAAQ;AACb,WAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9D;AACJ;AAEA,eAAsB,gBAClB,KACA,MACe;AACf,MAAI;AACA,UAAM,UAAU,KAAK,WAAW,KAAK,UAAU,IAAI,KAAK;AACxD,QAAI,CAAC,OAAQ,QAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,mBAAmB,CAAC;AAChF,UAAM,WAAO,+BAAW,IAAI,KAAK,IAAI,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC;AACpE,QAAI,CAAC,KAAM,QAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,eAAe,MAAM,cAAc,CAAC;AAC9F,QAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAI,UAAU,QAAQ,sBAAsB,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvF;AACA,WAAO,KAAK,UAAU,EAAE,SAAS,MAAM,KAAK,GAAG,MAAM,CAAC;AAAA,EAC1D,SAAS,GAAQ;AACb,WAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9D;AACJ;AAEA,eAAsB,iBAClB,KACA,MAae;AACf,MAAI;AACA,UAAM,UAAU,KAAK,WAAW,KAAK,UAAU,IAAI,KAAK;AACxD,QAAI,CAAC,OAAQ,QAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,mBAAmB,CAAC;AAChF,UAAM,gBAAgB,KAAK,kBAAkB,KAAK,gBAAgB,IAAI,KAAK,KAAK;AAChF,UAAM,mBAAmB,KAAK,qBAAqB,KAAK,mBAAmB,IAAI,KAAK,KAAK;AACzF,UAAM,oBAAoB,KAAK,wBAAwB,QAAQ,KAAK,sBAAsB;AAC1F,UAAM,WAAO,gCAAY,IAAI,KAAK,IAAI,QAAQ;AAAA,MAC1C,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,iBAAiB,KAAK,sBAAsB,QAAQ,KAAK,oBAAoB;AAAA,MAC7E,oBAAoB,kBAAkB,QAAQ,CAAC;AAAA,IACnD,CAAC;AACD,QAAI,CAAC,KAAM,QAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,eAAe,MAAM,cAAc,CAAC;AAC9F,QAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAI,UAAU,QAAQ,sBAAsB,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvF;AACA,WAAO,KAAK,UAAU,EAAE,SAAS,MAAM,KAAK,GAAG,MAAM,CAAC;AAAA,EAC1D,SAAS,GAAQ;AACb,WAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9D;AACJ;AAEA,eAAsB,aAClB,KACA,MACe;AACf,QAAM,oBAAoB,WAAW,KAAK,SAAS,KAAK,WAAW,KAAK,QAAQ;AAChF,QAAM,qBAAiB,gDAA4B,mBAAmB,KAAK,OAAO;AAClF,MAAI,CAAC,eAAe,OAAO;AACvB,WAAO,KAAK,UAAU;AAAA,MAClB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU,eAAe,YAAY;AAAA,MACrC,YAAY,eAAe;AAAA,MAC3B,mBAAmB,eAAe;AAAA,MAClC,OAAO,kEAAkE,eAAe,WAAW,KAAK,IAAI,CAAC;AAAA,IACjH,CAAC;AAAA,EACL;AACA,QAAM,WAAW,eAAe;AAChC,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAGxD,MAAI,KAAK,QAAQ,UAAU;AACvB,WAAO,KAAK,UAAU,EAAE,OAAO,SAAS,KAAK,OAAO,iBAAiB,CAAC;AAAA,EAC1E;AAKA,QAAM,YAAY,2BAA2B,KAAK,IAAI;AACtD,MAAI,UAAU,WAAW;AACrB,WAAO,KAAK,UAAU;AAAA,MAClB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,QAAQ,UAAU;AAAA,MAClB,kBAAkB,UAAU,QAAQ;AAAA,QAChC,IAAI,UAAU,MAAM;AAAA,QACpB,WAAW,UAAU,MAAM,aAAa,UAAU,MAAM,aAAa,UAAU,MAAM;AAAA,QACrF,QAAQ,UAAU,MAAM,UAAU,UAAU,MAAM,gBAAgB,UAAU,MAAM;AAAA,QAClF,WAAW,UAAU,MAAM,aAAa,UAAU,MAAM,mBAAmB,UAAU,MAAM;AAAA,MAC/F,IAAI;AAAA,IACR,CAAC;AAAA,EACL;AAEA,MAAI;AAEA,QAAI,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AACnD,YAAM,MAAM,MAAO,IAAI,UAA6B,gBAAgB,KAAK,UAAU;AAAA,QAC/E,QAAQ,IAAI,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MACnC,CAAC;AACD,aAAO,KAAK,UAAU,GAAG;AAAA,IAC7B;AASA,UAAM,cAAc,wBAAwB,KAAK,IAAI;AACrD,QAAI,IAAI,qBAAqB,gBAAgB,KAAK,YAAY,CAAC,aAAa;AACxE,YAAM,SAAS,4BAA4B,IAAI,oBAAoB,KAAK,SAAS,KAAK,cAAc,EAAE,CAAC;AACvG,YAAM,aAAS,+BAAW;AAC1B,YAAMC,UAAS,MAAM,yBAAyB,KAAK,MAAM;AAAA,QACrD,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,QACd,cAAc,QAAQ;AAAA,MAC1B,CAAC;AACD,UAAIA,QAAO,SAAS;AAEhB,cAAM,sBAAsB,KAAK,cAAcA,QAAO;AACtD,YAAI;AACA,gBAAM,eAAeA,QAAO,gBAAgB,QAAQ;AACpD,oDAAkB,IAAI,KAAK,IAAI;AAAA,YAC3B,MAAM;AAAA,YACN,QAAQ,KAAK;AAAA,YACb,WAAW;AAAA,YACX;AAAA,YACA,SAAS,uBAAuB,KAAK,SAAS,cAAc;AAAA,cACxD;AAAA,cACA;AAAA,cACA;AAAA,cACA,iBAAiB;AAAA,YACrB,CAAC;AAAA,UACL,CAAC;AAAA,QACL,QAAQ;AAAA,QAAoB;AAAA,MAChC;AACA,aAAO,KAAK,UAAU;AAAA,QAClB,GAAGA;AAAA,QACH,QAAQ,KAAK;AAAA,QACb,WAAWA,QAAO,UAAW,KAAK,cAAcA,QAAO,YAAa,KAAK;AAAA,QACzE,GAAIA,QAAO,UAAU,EAAE,QAAQ,UAAU,OAAO,IAAI,CAAC;AAAA,QACrD;AAAA,QACA,GAAIA,QAAO,WAAWA,QAAO,eAAe,EAAE,cAAcA,QAAO,aAAa,IAAI,CAAC;AAAA,QACrF,YAAYA,QAAO,YAAY;AAAA,MACnC,CAAC;AAAA,IACL;AAMA,QAAI,KAAK,cAAc,iBAAiB,IAAI,SAAS,GAAG;AACpD,YAAM,SAAS,4BAA4B,IAAI,oBAAoB,KAAK,SAAS,KAAK,UAAU,CAAC;AACjG,UAAI,uBAAuB,QAAQ,gBAAgB;AACnD,UAAI,CAAC,sBAAsB;AACvB,cAAM,eAAe,MAAM,eAAe,KAAK,MAAM,uBAAuB,CAAC,CAAC;AAC9E,cAAM,WAAW,8BAA8B,YAAY;AAC3D,cAAM,kBAAkB,SAAS,KAAK,aAAW,oBAAoB,OAAO,MAAM,KAAK,UAAU;AACjG,YAAI,CAAC,iBAAiB;AAClB,iBAAO,KAAK,UAAU;AAAA,YAClB,SAAS;AAAA,YACT,aAAa;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,kBAAkB;AAAA,YAClB,QAAQ,KAAK;AAAA,YACb,WAAW,KAAK;AAAA,YAChB,OAAO,kBAAkB,KAAK,UAAU,6CAA6C,KAAK,OAAO;AAAA,YACjG,YAAY,6DAA6D,KAAK,OAAO;AAAA,UACzF,CAAC;AAAA,QACL;AACA,+BAAuB,2BAA2B,eAAe;AACjE,YAAI,sBAAsB;AACtB,sCAA4B,IAAI,oBAAoB,KAAK,SAAS,KAAK,UAAU,GAAG;AAAA,YAChF,cAAc;AAAA,YACd,mBAAmB,WAAW,iBAAiB,iBAAiB,KAAK;AAAA,UACzE,CAAC;AAAA,QACL;AAAA,MACJ;AACA,UAAI,CAAC,sBAAsB;AACvB,eAAO,KAAK,UAAU;AAAA,UAClB,SAAS;AAAA,UACT,aAAa;AAAA,UACb,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,kBAAkB;AAAA,UAClB,QAAQ,KAAK;AAAA,UACb,WAAW,KAAK;AAAA,UAChB,OAAO,kBAAkB,KAAK,UAAU;AAAA,UACxC,YAAY,wCAAwC,KAAK,OAAO;AAAA,QACpE,CAAC;AAAA,MACL;AACA,YAAM,iBAAiB,MAAM,eAAe,KAAK,MAAM,iBAAiB;AAAA,QACpE,iBAAiB,KAAK;AAAA,QACtB,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,SAAS,KAAK;AAAA,MAClB,CAAC;AACD,YAAM,kBAAkB,qBAAqB,cAAc;AAC3D,UAAI,iBAAiB,YAAY,SAAS,gBAAgB,YAAY,OAAO;AACzE,cAAM,SAAS,iBAAiB,YAAY,QAAQ,kBAAkB;AACtE,eAAO,KAAK,UAAU;AAAA,UAClB,GAAI,UAAU,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,UACrD,SAAS;AAAA,UACT,QAAQ,KAAK;AAAA,UACb,WAAW,KAAK;AAAA,UAChB,OAAO,iBAAiB,SAAS,gBAAgB,SAAS;AAAA,QAC9D,CAAC;AAAA,MACL;AACA,YAAM,aAAS,+BAAW;AAC1B,UAAI;AACA,kDAAkB,IAAI,KAAK,IAAI;AAAA,UAC3B,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,WAAW,KAAK;AAAA,UAChB,cAAc;AAAA,UACd,SAAS,uBAAuB,KAAK,SAAS,gBAAgB;AAAA,YAC1D;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,iBAAiB,KAAK;AAAA,UAC1B,CAAC;AAAA,QACL,CAAC;AAAA,MACL,QAAQ;AAAA,MAAoB;AAC5B,aAAO,KAAK,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,QAAQ,UAAU,QAAQ,UAAU,cAAc,sBAAsB,QAAQ,KAAK,SAAS,WAAW,KAAK,WAAW,CAAC;AAAA,IACvL;AAGA,UAAM,WAAO,gCAAY,IAAI,KAAK,IAAI,KAAK,SAAS;AAAA,MAChD,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK;AAAA,MACtB;AAAA,IACJ,CAAC;AAED,QAAI,iBAAiB,IAAI,SAAS,KAAK,IAAI,qBAAqB,cAAc;AAC1E,UAAI,UAAU,QAAQ,sBAAsB,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvF;AAGA,UAAM,gBAAgB,iBAAiB,IAAI,SAAS,QAC9C,sDAAkC,IAAI,KAAK,EAAE,IAC7C,CAAC;AAEP,UAAM,SAAkC,EAAE,SAAS,MAAM,QAAQ,SAAS,QAAQ,KAAK,SAAS,QAAQ,KAAK,IAAI,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS;AAC9J,QAAI,cAAc,SAAS,GAAG;AAC1B,aAAO,2BAA2B;AAAA,IACtC;AACA,WAAO,KAAK,UAAU,MAAM;AAAA,EAChC,SAAS,GAAQ;AACb,UAAM,UAAU,gCAAgC,GAAG;AAAA,MAC/C,SAAS;AAAA,MACT,gBAAgB,KAAK;AAAA,MACrB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,IACpB,CAAC;AACD,WAAO,KAAK,UAAU,OAAO;AAAA,EACjC;AACJ;AAEA,eAAsB,aAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,4BAA4B,KAAK,KAAK,OAAO;AAChE,MAAI,CAAC,MAAM;AACP,WAAO,KAAK,UAAU,iCAAiC,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,EAC9E;AAEA,MAAI,IAAI,qBAAqB,gBAAgB,iBAAiB,IAAI,SAAS,GAAG;AAC1E,UAAM,8BAA8B,KAAK,EAAE,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC;AAAA,EACxE;AAEA,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,SAAS,4BAA4B,IAAI,oBAAoB,KAAK,SAAS,KAAK,UAAU,CAAC;AACjG,UAAM,oBAAoB,OAAO,KAAK,wBAAwB,YAAY,KAAK,oBAAoB,KAAK,IAClG,KAAK,oBAAoB,KAAK,IAC9B,QAAQ;AACd,UAAM,SAAS,MAAM,eAAe,KAAK,MAAM,aAAa;AAAA,MACxD,WAAW,KAAK;AAAA,MAChB,iBAAiB,KAAK;AAAA,MACtB,WAAW,KAAK;AAAA,MAChB,GAAI,QAAQ,eAAe,EAAE,WAAW,OAAO,cAAc,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,MACpG,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,MACjD,WAAW,KAAK,QAAQ;AAAA,IAC5B,CAAC;AACD,UAAM,UAAU,8BAA8B,qBAAqB,MAAM,GAA0B;AAAA,MAC/F,KAAK,QAAQ,KAAK,OAAO,IAAI,KAAK,UAAU;AAAA,MAC5C,UAAU;AAAA,MACV,4BAA4B;AAAA,IAChC,CAAC;AACD,QAAI,KAAK,SAAS;AACd,YAAM,iBAAiB,mBAAmB,SAAS;AAAA,QAC/C,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK,QAAQ;AAAA,MACxB,CAAC;AACD,aAAO,KAAK;AAAA,QACR,QAAQ,kBAAkB,EAAE,GAAG,gBAAgB,iBAAiB,QAAQ,gBAAgB,IAAI;AAAA,QAC5F;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,WAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,EAC1C,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI;AACA,YAAM,WAAW,GAAG,KAAK,QAAQ,YAAY,KAAK,UAAU;AAC5D,YAAM,MAAM,MAAO,IAAI,UAA6B,SAAS,UAAU;AAAA,QACnE,OAAO,KAAK,QAAQ;AAAA,QACpB,WAAW,KAAK;AAAA,MACpB,CAAC;AACD,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,8CAA8C,CAAC;AAAA,EAClF;AACJ;AAEA,eAAsB,cAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAExD,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,SAAS,4BAA4B,IAAI,oBAAoB,KAAK,SAAS,KAAK,UAAU,CAAC;AACjG,UAAM,oBAAoB,OAAO,KAAK,wBAAwB,YAAY,KAAK,oBAAoB,KAAK,IAClG,KAAK,oBAAoB,KAAK,IAC9B,QAAQ;AACd,UAAM,WAAW,KAAK,aAAa,WAAW,SAAY;AAC1D,UAAM,SAAS,MAAM,eAAe,KAAK,MAAM,yBAAyB;AAAA,MACpE,WAAW,KAAK;AAAA,MAChB,iBAAiB,KAAK;AAAA,MACtB,WAAW,KAAK;AAAA,MAChB,GAAI,QAAQ,eAAe,EAAE,WAAW,OAAO,cAAc,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,MACpG,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,MACjD,WAAW,KAAK,QAAQ;AAAA,MACxB,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACnC,CAAC;AACD,UAAM,UAAU,qBAAqB,MAAM;AAC3C,WAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,EAC1C,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI;AACA,YAAM,WAAW,GAAG,KAAK,QAAQ,YAAY,KAAK,UAAU;AAC5D,YAAM,MAAM,MAAO,IAAI,UAA6B,mBAAmB,UAAU;AAAA,QAC7E,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK,QAAQ;AAAA,QACxB,UAAU,KAAK;AAAA,MACnB,CAAC;AACD,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ;AAEA,SAAO,KAAK,UAAU,EAAE,OAAO,+CAA+C,CAAC;AACnF;AAEA,eAAsB,kBAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAExD,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,QAAI,uBAAuB,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,IAAI,KAAK,OAAO;AAC3F,QAAI,CAAC,sBAAsB;AACvB,YAAM,mBAAmB,qBAAqB,KAAK,MAAM;AACzD,UAAI,CAAC,iBAAiB,QAAQ;AAC1B,eAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,+BAA+B,KAAK,OAAO,EAAE,CAAC;AAAA,MACjG;AAEA,YAAM,SAAmB,CAAC;AAC1B,iBAAW,gBAAgB,kBAAkB;AACzC,cAAM,iBAAiB,MAAM,eAAe,KAAK,MAAM,mBAAmB,EAAE,aAAa,CAAC;AAC1F,cAAM,kBAAkB,qBAAqB,cAAc;AAC3D,YAAI,iBAAiB,WAAW,iBAAiB,UAAU;AACvD,iCAAuB;AACvB;AAAA,QACJ;AACA,eAAO,KAAK,GAAG,YAAY,KAAK,iBAAiB,SAAS,cAAc,EAAE;AAAA,MAC9E;AACA,UAAI,CAAC,sBAAsB;AACvB,eAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,yCAAyC,KAAK,OAAO,4BAA4B,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,MACzJ;AAAA,IACJ;AAEA,UAAM,kBAAkB,uBAAuB,GAAG;AAClD,UAAM,sBAAsB,iBAAiB,YAAY,IAAI;AAC7D,UAAM,2BAA2B,6BAA6B,IAAI,KAAK,MAAM;AAC7E,UAAM,cAAc,wBAAwB,KAAK,IAAI;AACrD,QAAI,KAAK,YAAY,CAAC,eAAe,CAAC,qBAAqB;AACvD,aAAO,KAAK,UAAU,uCAAuC,KAAK,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAAA,IAC1G;AACA,QAAI;AACJ,QAAI;AACA,eAAS,MAAM,eAAe,KAAK,MAAM,cAAc;AAAA,QACnD,SAAS;AAAA,QACT,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,UACN,aAAa,IAAI,KAAK;AAAA,UACtB,YAAY,KAAK;AAAA,UACjB;AAAA,UACA,GAAI,sBAAsB,EAAE,yBAAyB,oBAAoB,IAAI,CAAC;AAAA,UAC9E,GAAI,iBAAiB,KAAK,EAAE,uBAAuB,gBAAgB,GAAG,IAAI,CAAC;AAAA,UAC3E,uBAAuB;AAAA,QAC3B;AAAA,MACJ,CAAC;AAAA,IACL,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,+BAA+B,KAAK,MAAM,sBAAsB,CAAC,GAAG,MAAM,CAAC;AAAA,IACrG;AACA,UAAM,gBAAgB,qBAAqB,MAAM;AACjD,QAAI,eAAe,YAAY,SAAS,QAAQ,YAAY,OAAO;AAC/D,YAAM,cAAc,IAAI,MAAM,eAAe,SAAS,QAAQ,SAAS,wCAAwC;AAC/G,aAAO,KAAK,UAAU,+BAA+B,KAAK,MAAM,sBAAsB,WAAW,GAAG,MAAM,CAAC;AAAA,IAC/G;AACA,UAAM,mBAAmB,OAAO,eAAe,cAAc,WACvD,cAAc,YACd,OAAO,eAAe,OAAO,WACzB,cAAc,KACd,OAAO,eAAe,qBAAqB,WACvC,cAAc,mBACd;AACd,UAAM,oBAAoB,OAAO,eAAe,sBAAsB,YAAY,cAAc,kBAAkB,KAAK,IACjH,cAAc,kBAAkB,KAAK,IACrC;AACN,QAAI,kBAAkB;AAClB,kCAA4B,IAAI,oBAAoB,KAAK,SAAS,gBAAgB,GAAG;AAAA,QACjF,cAAc;AAAA,QACd,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,MACrD,CAAC;AAAA,IACL;AAEA,QAAI;AACA,gDAAkB,IAAI,KAAK,IAAI;AAAA,QAC3B,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,WAAW,oBAAoB;AAAA,QAC/B,cAAc;AAAA,QACd,SAAS,EAAE,kBAAkB;AAAA,MACjC,CAAC;AAAA,IACL,QAAQ;AAAA,IAAqC;AAG7C,QAAI,IAAI,qBAAqB,gBAAgB,KAAK,YAAY,CAAC,aAAa;AACxE,UAAI,UAAU,YAAY,KAAK,UAAU,sBAAsB,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC1G,WAAW,iBAAiB,IAAI,SAAS,GAAG;AACxC,UAAI,UAAU,QAAQ,sBAAsB,EAAE,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvF;AAEA,WAAO,KAAK,UAAU;AAAA,MAClB,GAAG;AAAA,MACH;AAAA,MACA,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,IACrD,GAAG,MAAM,CAAC;AAAA,EACd,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI,uBAAuB,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,IAAI,KAAK,OAAO;AAC3F,QAAI,CAAC,sBAAsB;AACvB,YAAM,mBAAmB,qBAAqB,KAAK,MAAM;AACzD,UAAI,CAAC,iBAAiB,QAAQ;AAC1B,eAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,+BAA+B,KAAK,OAAO,EAAE,CAAC;AAAA,MACjG;AACA,6BAAuB,iBAAiB,CAAC;AAAA,IAC7C;AAEA,UAAM,kBAAkB,uBAAuB,GAAG;AAClD,UAAM,sBAAsB,iBAAiB,YAAY,IAAI;AAC7D,UAAM,2BAA2B,6BAA6B,IAAI,KAAK,MAAM;AAC7E,QAAI,CAAC,qBAAqB;AACtB,aAAO,KAAK,UAAU,uCAAuC,KAAK,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAAA,IAC1G;AAEA,QAAI;AACA,YAAM,MAAM,MAAO,IAAI,UAA6B,OAAO,KAAK,UAAU;AAAA,QACtE,MAAM;AAAA,QACN,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,UACN,aAAa,IAAI,KAAK;AAAA,UACtB,YAAY,KAAK;AAAA,UACjB;AAAA,UACA,GAAI,sBAAsB,EAAE,yBAAyB,oBAAoB,IAAI,CAAC;AAAA,UAC9E,GAAI,iBAAiB,KAAK,EAAE,uBAAuB,gBAAgB,GAAG,IAAI,CAAC;AAAA,UAC3E,uBAAuB;AAAA,QAC3B;AAAA,MACJ,CAAC;AAED,YAAM,mBAAmB,OAAO,KAAK,cAAc,WAAW,IAAI,YAAY,OAAO,KAAK,OAAO,WAAW,IAAI,KAAK;AACrH,UAAI;AACA,kDAAkB,IAAI,KAAK,IAAI;AAAA,UAC3B,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,WAAW,oBAAoB;AAAA,UAC/B,cAAc;AAAA,UACd,SAAS,CAAC;AAAA,QACd,CAAC;AAAA,MACL,QAAQ;AAAA,MAAoB;AAE5B,aAAO,KAAK,UAAU,EAAE,GAAG,KAAK,qBAAqB,GAAG,MAAM,CAAC;AAAA,IACnE,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,+BAA+B,KAAK,MAAM,sBAAsB,CAAC,GAAG,MAAM,CAAC;AAAA,IACrG;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,mDAAmD,CAAC;AAAA,EACvF;AACJ;AAEA,eAAsB,cAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAGxD,QAAM,yBAA0B,KAAK,QAAgB,2BAA2B;AAChF,QAAM,uBAAwB,KAAK,QAAgB,wBAAwB,CAAC;AAE5E,MAAI;AACA,QAAI,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AACnD,YAAM,SAAS,MAAO,IAAI,UAA6B,UAAU,KAAK,UAAU,KAAK,WAAW,MAAM,IAAI;AAC1G,aAAO,KAAK,UAAU;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,QAAQ,iBAAiB,MAAM;AAAA,QAC/B,MAAM,eAAe,MAAM;AAAA,QAC3B,YAAY,yBAAyB,kBAAkB,QAAQ,oBAAoB,IAAI;AAAA,QACvF,cAAc,MAAM,2BAA2B,KAAK,IAAI;AAAA,MAC5D,GAAG,MAAM,CAAC;AAAA,IACd,WAAW,iBAAiB,IAAI,SAAS,GAAG;AACxC,YAAM,eAAe,MAAM,eAAe,KAAK,MAAM,cAAc;AAAA,QAC/D,WAAW,KAAK;AAAA,QAChB,iBAAiB;AAAA,QACjB,mBAAmB;AAAA,QACnB,sBAAsB,qBAAqB,SAAS,IAAI,uBAAuB;AAAA,MACnF,CAAC;AACD,YAAM,aAAa,MAAM,eAAe,KAAK,MAAM,oBAAoB;AAAA,QACnE,WAAW,KAAK;AAAA,MACpB,CAAC;AACD,aAAO,KAAK,UAAU;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,QAAQ,iBAAiB,YAAY;AAAA,QACrC,MAAM,eAAe,UAAU;AAAA,QAC/B,YAAY,yBAAyB,kBAAkB,cAAc,oBAAoB,IAAI;AAAA,QAC7F,cAAc,MAAM,2BAA2B,KAAK,IAAI;AAAA,MAC5D,GAAG,MAAM,CAAC;AAAA,IACd,OAAO;AACH,aAAO,KAAK,UAAU,EAAE,OAAO,mDAAmD,CAAC;AAAA,IACvF;AAAA,EACJ,SAAS,GAAQ;AACb,UAAM,UAAU,gCAAgC,GAAG;AAAA,MAC/C,SAAS;AAAA,MACT,gBAAgB,KAAK;AAAA,MACrB,QAAQ,KAAK;AAAA,IACjB,CAAC;AACD,WAAO,KAAK,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,WAAW,KAAK;AAAA,IACpB,GAAG,MAAM,CAAC;AAAA,EACd;AACJ;AAEA,eAAsB,oBAClB,KACA,MACe;AACf,QAAM,sBAAsB,GAAG;AAC/B,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AACxD,QAAM,uBAAwB,KAAK,QAAgB,wBAAwB,CAAC;AAE5E,MAAI,KAAK,QAAQ,UAAU;AACvB,WAAO,KAAK,UAAU;AAAA,MAClB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,MACV,iBAAiB,CAAC,gBAAgB;AAAA,IACtC,GAAG,MAAM,CAAC;AAAA,EACd;AAEA,MAAI;AACA,UAAM,SAAS,KAAK,YAAY,QAAQ,KAAK,YAAY;AACzD,UAAM,SAAS,MAAM,eAAe,KAAK,MAAM,0BAA0B;AAAA,MACrE,QAAQ,IAAI,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,MACxD,SAAS,KAAK,YAAY,QAAQ,KAAK,YAAY;AAAA,MACnD;AAAA,MACA,kBAAkB,KAAK,sBAAsB;AAAA,MAC7C,sBAAsB,qBAAqB,SAAS,IAAI,uBAAuB;AAAA,IACnF,CAAC;AACD,WAAO,KAAK,UAAU,qBAAqB,MAAM,GAAG,MAAM,CAAC;AAAA,EAC/D,SAAS,GAAQ;AACb,UAAM,UAAU,gCAAgC,GAAG;AAAA,MAC/C,SAAS;AAAA,MACT,gBAAgB,KAAK;AAAA,MACrB,QAAQ,KAAK;AAAA,IACjB,CAAC;AACD,WAAO,KAAK,UAAU;AAAA,MAClB,GAAG;AAAA,MACH,WAAW,KAAK;AAAA,MAChB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,MACV,iBAAiB,CAAC,QAAQ,QAAQ,+BAA+B;AAAA,IACrE,GAAG,MAAM,CAAC;AAAA,EACd;AACJ;AAEA,eAAsB,eAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAGxD,MAAI,KAAK,QAAQ,UAAU;AACvB,WAAO,KAAK,UAAU,EAAE,OAAO,SAAS,KAAK,OAAO,0CAAqC,CAAC;AAAA,EAC9F;AAEA,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,SAAS,MAAM,eAAe,KAAK,MAAM,kBAAkB;AAAA,MAC7D,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,kBAAkB;AAAA,IACtB,CAAC;AAGD,QAAI;AACA,gDAAkB,IAAI,KAAK,IAAI;AAAA,QAC3B,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,SAAS,EAAE,SAAS,KAAK,SAAS,QAAS,QAAgB,YAAY,OAAO;AAAA,MAClF,CAAC;AAAA,IACL,QAAQ;AAAA,IAAqC;AAE7C,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACzC,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI;AACA,YAAM,MAAM,MAAO,IAAI,UAA6B,cAAc,KAAK,UAAU;AAAA,QAC7E,WAAW,KAAK;AAAA,QAChB,SAAS,KAAK;AAAA,QACd,kBAAkB;AAAA,MACtB,CAAC;AACD,UAAI;AACA,kDAAkB,IAAI,KAAK,IAAI;AAAA,UAC3B,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,SAAS,EAAE,SAAS,KAAK,SAAS,QAAS,KAAa,YAAY,OAAO;AAAA,QAC/E,CAAC;AAAA,MACL,QAAQ;AAAA,MAAoB;AAC5B,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,+CAA+C,CAAC;AAAA,EACnF;AACJ;AAEA,eAAsB,YAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAExD,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,SAAS,4BAA4B,IAAI,oBAAoB,KAAK,SAAS,KAAK,UAAU,CAAC;AACjG,UAAM,oBAAoB,QAAQ;AAClC,UAAM,SAAS,MAAM,eAAe,KAAK,MAAM,kBAAkB;AAAA,MAC7D,WAAW,KAAK;AAAA,MAChB,iBAAiB,KAAK;AAAA,MACtB,WAAW,KAAK;AAAA,MAChB,GAAI,QAAQ,eAAe,EAAE,WAAW,OAAO,cAAc,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,MACpG,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;AAAA,MACjD,QAAQ,KAAK,WAAW,WAAW,WAAW;AAAA,IAClD,CAAC;AACD,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACzC,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI;AACA,YAAM,WAAW,GAAG,KAAK,QAAQ,YAAY,KAAK,UAAU;AAC5D,YAAM,MAAM,MAAO,IAAI,UAA6B,QAAQ,UAAU,KAAK,WAAW,WAAW,WAAW,SAAS;AACrH,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,4CAA4C,CAAC;AAAA,EAChF;AACJ;AAEA,eAAsB,cAClB,KACA,MACe;AACf,QAAM,aAAa,MAAM,oBAAoB,KAAK,KAAK,cAAc;AAErE,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,SAAS,MAAM,eAAe,KAAK,YAAY,mBAAmB;AAAA,MACpE,QAAQ,IAAI,KAAK;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,YAAY,IAAI;AAAA,IACpB,CAAC;AACD,UAAM,eAAe,wBAAwB,MAAM;AACnD,QAAI,cAAc,WAAW,aAAa,MAAM,IAAI;AAChD,YAAM,gBAAgB,IAAI,KAAK,MAAM,UAAU,OAAK,EAAE,OAAO,aAAa,KAAK,EAAE;AACjF,UAAI,iBAAiB,EAAG,KAAI,KAAK,MAAM,aAAa,IAAI,aAAa;AAAA,UAChE,KAAI,KAAK,MAAM,KAAK,aAAa,IAAI;AAC1C,UAAI,KAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC5C,YAAM,+BAA+B,GAAG;AAAA,IAC5C;AACA,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACzC,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,WAAW,UAAU;AAChE,QAAI;AACA,YAAM,MAAM,MAAO,IAAI,UAA6B,cAAc,WAAW,UAAU;AAAA,QACnF,QAAQ,IAAI,KAAK;AAAA,QACjB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,YAAY,IAAI;AAAA,MACpB,CAAC;AACD,YAAM,eAAe,wBAAwB,GAAG;AAChD,UAAI,cAAc,WAAW,aAAa,MAAM,IAAI;AAChD,cAAM,gBAAgB,IAAI,KAAK,MAAM,UAAU,OAAK,EAAE,OAAO,aAAa,KAAK,EAAE;AACjF,YAAI,iBAAiB,EAAG,KAAI,KAAK,MAAM,aAAa,IAAI,aAAa;AAAA,YAChE,KAAI,KAAK,MAAM,KAAK,aAAa,IAAI;AAC1C,YAAI,KAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC5C,cAAM,+BAA+B,GAAG;AAAA,MAC5C;AACA,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,sDAAsD,CAAC;AAAA,EAC1F;AACJ;AAEA,eAAsB,oBAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAExD,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,SAAS,MAAM,eAAe,KAAK,MAAM,yBAAyB;AAAA,MACpE,QAAQ,IAAI,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK,YAAY;AAAA,MACzB,YAAY,IAAI;AAAA,IACpB,CAAC;AACD,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACzC,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI;AACA,YAAM,MAAM,MAAO,IAAI,UAA6B,oBAAoB,KAAK,UAAU;AAAA,QACnF,QAAQ,IAAI,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,QAAQ,KAAK,YAAY;AAAA,QACzB,YAAY,IAAI;AAAA,MACpB,CAAC;AACD,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,qDAAqD,CAAC;AAAA,EACzF;AACJ;AAEA,eAAsB,eAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAExD,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,aAAa,oBAAoB,KAAK,KAAK,SAAS,KAAK,oBAAoB;AACnF,QAAI;AACJ,QAAI;AACJ,QAAI;AACA,eAAS,MAAM,eAAe,KAAK,MAAM,oBAAoB,UAAU;AAAA,IAC3E,SAAS,GAAQ;AACb,UAAI,IAAI,qBAAqB,gBAAiB,KAAa,mBAAmB,+BAA+B,CAAC,GAAG;AAC7G,iBAAS,MAAM,IAAI,UAAU,QAAQ,oBAAoB,UAAU;AACnE,4BAAoB;AAAA,UAChB,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ,GAAG,WAAW,OAAO,CAAC;AAAA,QAClC;AAAA,MACJ,OAAO;AACH,eAAO,KAAK,UAAU;AAAA,UAClB,SAAS;AAAA,UACT,MAAM,+BAA+B,CAAC,IAAI,oBAAoB;AAAA,UAC9D,OAAO,GAAG,WAAW,OAAO,CAAC;AAAA,UAC7B,cAAc,+BAA+B,CAAC,IACxC,mLACA;AAAA,QACV,GAAG,MAAM,CAAC;AAAA,MACd;AAAA,IACJ;AACA,QAAI,QAAQ,WAAW,OAAO,YAAY,OAAO;AAC7C,YAAM,MAAM,IAAI,KAAK,MAAM,UAAU,OAAK,EAAE,OAAO,KAAK,OAAO;AAC/D,UAAI,OAAO,GAAG;AACV,YAAI,KAAK,MAAM,OAAO,KAAK,CAAC;AAC5B,YAAI,KAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChD;AAAA,IACJ;AACA,WAAO,KAAK,UAAU,EAAE,GAAI,UAAU,CAAC,GAAI,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC,EAAG,GAAG,MAAM,CAAC;AAAA,EAC7G,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI;AACA,YAAM,MAAM,MAAO,IAAI,UAA6B,eAAe,KAAK,UAAU;AAAA,QAC9E,QAAQ,IAAI,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,GAAI,KAAK,uBAAuB,EAAE,oBAAoB,KAAK,qBAAqB,IAAI,CAAC;AAAA,QACrF,YAAY,IAAI;AAAA,MACpB,CAAC;AACD,UAAI,KAAK,WAAW,IAAI,YAAY,OAAO;AACvC,cAAM,MAAM,IAAI,KAAK,MAAM,UAAU,OAAK,EAAE,OAAO,KAAK,OAAO;AAC/D,YAAI,OAAO,GAAG;AACV,cAAI,KAAK,MAAM,OAAO,KAAK,CAAC;AAC5B,cAAI,KAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChD;AAAA,MACJ;AACA,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,gDAAgD,CAAC;AAAA,EACpF;AACJ;AAEA,SAAS,wBAAwB,KAAkB,QAAqC;AACpF,MAAI,OAAQ,QAAO,SAAS,IAAI,MAAM,MAAM;AAC5C,QAAM,OAAO,IAAI,KAAK,MAAM,KAAK,CAAC,UAA8B,CAAC,CAAC,MAAM,SAAS;AACjF,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,4CAA4C;AACvE,SAAO;AACX;AAEA,eAAsB,uBAAuB,KAAmC;AAC5E,QAAM,OAAO,wBAAwB,GAAG;AACxC,QAAM,SAAS,MAAM,eAAe,KAAK,MAAM,iCAAiC,CAAC,CAAC;AAClF,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACzC;AAEA,eAAsB,yBAClB,KACA,MACe;AACf,QAAM,OAAO,wBAAwB,KAAK,KAAK,OAAO;AACtD,QAAM,SAAS,MAAM,eAAe,KAAK,MAAM,+BAA+B;AAAA,IAC1E,WAAW,KAAK;AAAA,IAChB,YAAY,IAAI;AAAA,IAChB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,EACjD,CAAC;AACD,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACzC;AAEA,eAAsB,wBAClB,KACA,MACe;AACf,QAAM,OAAO,wBAAwB,KAAK,KAAK,OAAO;AACtD,QAAM,SAAS,MAAM,eAAe,KAAK,MAAM,8BAA8B;AAAA,IACzE,WAAW,KAAK;AAAA,IAChB,YAAY,IAAI;AAAA,EACpB,CAAC;AACD,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACzC;AAEA,eAAsB,eAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AACxD,QAAM,SAAS,MAAM,eAAe,KAAK,MAAM,yBAAyB;AAAA,IACpE,QAAQ,IAAI,KAAK;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,YAAY,IAAI;AAAA,EACpB,CAAC;AACD,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACzC;AAEA,eAAsB,eAClB,KACA,MACe;AACf,QAAM,OAAO,MAAM,oBAAoB,KAAK,KAAK,OAAO;AAExD,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACjC,UAAM,SAAS,MAAM,eAAe,KAAK,MAAM,oBAAoB;AAAA,MAC/D,QAAQ,IAAI,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,YAAY,IAAI;AAAA,IACpB,CAAC;AACD,QAAI,QAAQ,WAAW,OAAO,UAAU,QAAQ,OAAO,cAAc,YAAY,OAAO;AACpF,YAAM,MAAM,IAAI,KAAK,MAAM,UAAU,OAAK,EAAE,OAAO,KAAK,OAAO;AAC/D,UAAI,OAAO,GAAG;AACV,YAAI,KAAK,MAAM,OAAO,KAAK,CAAC;AAC5B,YAAI,KAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChD;AAAA,IACJ;AACA,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACzC,WAAW,CAAC,iBAAiB,IAAI,SAAS,KAAK,KAAK,UAAU;AAC1D,QAAI;AACA,YAAM,MAAM,MAAO,IAAI,UAA6B,eAAe,KAAK,UAAU;AAAA,QAC9E,QAAQ,IAAI,KAAK;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,YAAY,IAAI;AAAA,MACpB,CAAC;AACD,UAAI,KAAK,WAAW,IAAI,UAAU,QAAQ,IAAI,cAAc,YAAY,OAAO;AAC3E,cAAM,MAAM,IAAI,KAAK,MAAM,UAAU,OAAK,EAAE,OAAO,KAAK,OAAO;AAC/D,YAAI,OAAO,GAAG;AACV,cAAI,KAAK,MAAM,OAAO,KAAK,CAAC;AAC5B,cAAI,KAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChD;AAAA,MACJ;AACA,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACtC,SAAS,GAAQ;AACb,aAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACJ,OAAO;AACH,WAAO,KAAK,UAAU,EAAE,OAAO,gDAAgD,CAAC;AAAA,EACpF;AACJ;;;AKhvGA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,mBAA2B;AACzC,QAAM,YAAY,eAAe,IAAI,UAAQ,KAAK,IAAI;AACtD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAwBW,eAAe,KAAK,IAAI,CAAC;AAAA,oBACzB,UAAU,KAAK,IAAI,CAAC;AAAA,EACtC,KAAK;AACP;;;ACvCA,oBAAuB;AACvB,mBAAqC;AACrC,qBAAe;AACf,mBAGO;;;ACZP,IAAM,eAAe;AAOd,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EAER,YAAY,OAA8B,CAAC,GAAG;AAC5C,SAAK,UAAU,oBAAoB,KAAK,QAAQ,YAAY;AAC5D,SAAK,aAAa,KAAK,WAAW,UAAU,KAAK,QAAQ,KAAK;AAAA,EAChE;AAAA,EAEQ,UAAkC;AACxC,UAAM,IAA4B,EAAE,gBAAgB,mBAAmB;AACvE,QAAI,KAAK,WAAY,GAAE,eAAe,IAAI,KAAK;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAA0B;AAC9B,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,kBAAkB,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACpF,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,EAAE;AACjE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,MAAc,OAAgC,CAAC,GAAiB;AAC5E,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,mBAAmB;AAAA,MACxD,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,MACtB,MAAM,KAAK,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;AAAA,IACxC,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,UAAU;AACxD,YAAM,IAAI,MAAM,WAAW,IAAI,YAAY,IAAI,MAAM,IAAI,IAAI,EAAE;AAAA,IACjE;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,KAAK,UAAU;AACrB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC9CA,IAAM,mBAAmB;AAOlB,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EAER,YAAY,MAA6B;AACvC,SAAK,SAAS,KAAK;AACnB,SAAK,UAAU,KAAK,WAAW;AAAA,EACjC;AAAA,EAEQ,UAAkC;AACxC,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,iBAAiB,UAAU,KAAK,MAAM;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,mBAA+C;AACnD,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,uBAAuB,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACzF,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,8BAA8B,IAAI,MAAM,EAAE;AACvE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,iBAAiB,MAMI;AACzB,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,uBAAuB;AAAA,MAC5D,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,MACtB,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,8BAA8B,IAAI,MAAM,EAAE;AACvE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,iBAAiB,QAA+B;AACpD,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,uBAAuB,mBAAmB,MAAM,CAAC,IAAI;AAAA,MAC1F,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,8BAA8B,IAAI,MAAM,EAAE;AAAA,EACzE;AAAA,EAEA,MAAM,cAA4B;AAChC,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,mBAAmB,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACrF,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,wBAAwB,IAAI,MAAM,EAAE;AACjE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,UAAU,UAAgC;AAC9C,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,kBAAkB,IAAI,MAAM,EAAE;AAC3D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,gBAAgB,UAAgC;AACpD,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,mBAAmB,mBAAmB,QAAQ,CAAC;AAAA,MAC9D,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,EAAE;AAClE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,UAAkB,OAA+C,CAAC,GAAiB;AAChG,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,KAAK,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACtD,QAAI,KAAK,UAAW,QAAO,IAAI,aAAa,KAAK,SAAS;AAC1D,UAAM,KAAK,OAAO,SAAS,IAAI,IAAI,MAAM,KAAK;AAC9C,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC,QAAQ,EAAE;AAAA,MAC1E,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,EAAE;AAC9D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,mBACJ,UACA,OAA4G,CAAC,GAC/F;AACd,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU;AAAA,UACnB,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,UACtD,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,UACtD,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,UACtD,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,QACrD,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B,IAAI,MAAM,EAAE;AACtE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,UAAkB,SAAiB,OAAiD,CAAC,GAAiB;AACnH,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,EAAE,SAAS,GAAG,KAAK,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,qBAAqB,IAAI,MAAM,EAAE;AAC9D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,UAAkB,QAA8B,WAAkC;AAC9F,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,EAAE,QAAQ,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC,EAAG,CAAC;AAAA,MACtE;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mBAAmB,IAAI,MAAM,EAAE;AAC5D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,UAAU,UAAkB,WAAmB,cAAc,MAAM,kBAAkB,OAAqB;AAC9G,UAAM,SAAS,IAAI,gBAAgB,EAAE,WAAW,aAAa,OAAO,WAAW,GAAG,iBAAiB,OAAO,eAAe,EAAE,CAAC;AAC5H,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC,eAAe,MAAM;AAAA,MACrF,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,EAAE;AAC/D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,KAAK,UAAkB,MAAkE;AAC7F,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,gBAAgB,IAAI,MAAM,EAAE;AACzD,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,UAAkB,MAAoG;AACjI,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,kBAAkB,IAAI,MAAM,EAAE;AAC3D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,UAAkB,WAAmB,OAA0E,CAAC,GAAiB;AAC5I,UAAM,SAAS,IAAI,gBAAgB,EAAE,UAAU,CAAC;AAChD,QAAI,KAAK,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AACtD,QAAI,KAAK,KAAM,QAAO,IAAI,QAAQ,KAAK,IAAI;AAC3C,QAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,QAAI,KAAK,MAAO,QAAO,IAAI,SAAS,KAAK,KAAK;AAC9C,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC,YAAY,MAAM;AAAA,MAClF,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mBAAmB,IAAI,MAAM,EAAE;AAC5D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,UAAkB,WAAmB,OAA+D,CAAC,GAAiB;AAClI,UAAM,SAAS,IAAI,gBAAgB,EAAE,UAAU,CAAC;AAChD,QAAI,KAAK,KAAM,QAAO,IAAI,QAAQ,KAAK,IAAI;AAC3C,QAAI,KAAK,SAAU,QAAO,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AAC/D,QAAI,KAAK,OAAQ,QAAO,IAAI,UAAU,MAAM;AAC5C,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC,aAAa,MAAM;AAAA,MACnF,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,oBAAoB,IAAI,MAAM,EAAE;AAC7D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,UAAkB,MAA6E;AAC3G,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,oBAAoB,IAAI,MAAM,EAAE;AAC7D,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,cAAc,UAAkB,MAAwF;AAC5H,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,0BAA0B,IAAI,MAAM,EAAE;AACnE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,cAAc,UAAkB,SAA4B;AAChE,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,2BAA2B,IAAI,MAAM,EAAE;AACpE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,eAAe,UAAkB,SAA4B;AACjE,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,MAAM,EAAE;AACrE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,oBAAoB,UAAkB,SAA4B;AACtE,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,iCAAiC,IAAI,MAAM,EAAE;AAC1E,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,gBAAgB,UAAkB,SAA4B;AAClE,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B,IAAI,MAAM,EAAE;AACtE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,eAAe,UAAkB,SAA4B;AACjE,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG,KAAK,OAAO,qBAAqB,mBAAmB,QAAQ,CAAC;AAAA,MAChE;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,QAAQ;AAAA,QACtB,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,MAAM,EAAE;AACrE,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,KAAK,YAAY;AACvB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC/SO,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM,CAAC,QAAQ,MAAM;AAAA,IACrB,aAAa;AAAA,EACf;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAEA,eAAsB,aACpB,WACA,OAAyD,CAAC,GACzC;AACjB,QAAM,SAAS,KAAK,WAAW;AAE/B,MAAI,iBAAiB,SAAS,GAAG;AAE/B,UAAM,SAAS,MAAM,UAAU,UAAU;AACzC,UAAM,WAAkB,QAAQ,YAAY,CAAC;AAE7C,QAAI,QAAQ;AACV,aAAO,KAAK,UAAU;AAAA,QACpB,UAAU,SAAS,IAAI,CAAC,OAAY;AAAA,UAClC,IAAI,EAAE;AAAA,UACN,MAAM,EAAE,gBAAgB,EAAE,QAAQ;AAAA,UAClC,OAAO,EAAE,SAAS;AAAA,UAClB,QAAQ,EAAE,UAAU,EAAE,eAAe;AAAA,UACrC,WAAW,EAAE,aAAa;AAAA,QAC5B,EAAE;AAAA,MACJ,GAAG,MAAM,CAAC;AAAA,IACZ;AAEA,QAAI,SAAS,WAAW,EAAG,QAAO;AAClC,UAAM,QAAQ,SAAS,IAAI,CAAC,MAAW;AACrC,YAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,EAAE,gBAAgB,EAAE,QAAQ,SAAS,EAAE;AAC9E,UAAI,EAAE,MAAO,OAAM,KAAK,UAAU,EAAE,KAAK,EAAE;AAC3C,UAAI,EAAE,UAAU,EAAE,YAAa,OAAM,KAAK,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;AAChF,UAAI,EAAE,UAAW,OAAM,KAAK,cAAc,EAAE,SAAS,EAAE;AACvD,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,CAAC;AACD,WAAO,aAAa,SAAS,MAAM;AAAA,EAAO,MAAM,KAAK,IAAI,CAAC;AAAA,EAC5D;AAKA,SAAO,kBAAkB,WAAW,KAAK,WAAW,MAAM;AAC5D;AAEA,eAAe,kBACb,WACA,UACA,QACiB;AACjB,QAAM,YAAuD,CAAC;AAE9D,MAAI,UAAU;AACZ,UAAM,eAAe,MAAM,UAAU,gBAAgB,QAAQ;AAC7D,eAAW,KAAK,cAAc,YAAY,CAAC,GAAG;AAC5C,gBAAU,KAAK,EAAE,UAAU,SAAS,EAAE,CAAC;AAAA,IACzC;AAAA,EACF,OAAO;AACL,UAAM,OAAO,MAAM,UAAU,YAAY;AACzC,UAAM,UAAiB,MAAM,WAAW,CAAC;AAGzC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,YAAM,QAAQ;AAAA,QACZ,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,OAAO,MAAM;AACvC,cAAI;AACF,kBAAM,eAAe,MAAM,UAAU,gBAAgB,EAAE,EAAE;AACzD,uBAAW,KAAK,cAAc,YAAY,CAAC,GAAG;AAC5C,wBAAU,KAAK,EAAE,UAAU,EAAE,IAAI,SAAS,EAAE,CAAC;AAAA,YAC/C;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WAAO,KAAK,UAAU;AAAA,MACpB,UAAU,UAAU,IAAI,CAAC,EAAE,UAAU,KAAK,SAAS,EAAE,OAAO;AAAA,QAC1D,WAAW;AAAA,QACX,IAAI,EAAE;AAAA,QACN,MAAM,EAAE,gBAAgB;AAAA,QACxB,QAAQ,EAAE,UAAU;AAAA,QACpB,WAAW,EAAE,aAAa;AAAA,MAC5B,EAAE;AAAA,IACJ,GAAG,MAAM,CAAC;AAAA,EACZ;AAEA,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,QAAM,QAAQ,UAAU,IAAI,CAAC,EAAE,UAAU,KAAK,SAAS,EAAE,MAAM;AAC7D,UAAM,QAAQ;AAAA,MACZ,WAAW,GAAG;AAAA,MACd,YAAY,EAAE,EAAE;AAAA,MAChB,SAAS,EAAE,gBAAgB,SAAS;AAAA,IACtC;AACA,QAAI,EAAE,OAAQ,OAAM,KAAK,WAAW,EAAE,MAAM,EAAE;AAC9C,QAAI,EAAE,UAAW,OAAM,KAAK,cAAc,EAAE,SAAS,EAAE;AACvD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB,CAAC;AACD,SAAO,aAAa,UAAU,MAAM;AAAA,EAAO,MAAM,KAAK,IAAI,CAAC;AAC7D;;;AC5HO,IAAM,oBAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAEA,eAAsB,YACpB,WACA,OAAqC,CAAC,GACrB;AACjB,QAAM,SAAS,KAAK,WAAW;AAE/B,MAAI,iBAAiB,SAAS,GAAG;AAE/B,UAAM,SAAS,MAAM,UAAU,UAAU;AACzC,UAAM,SAAS;AAAA,MACb,IAAI,QAAQ,MAAM,QAAQ,cAAc;AAAA,MACxC,UAAU,QAAQ,YAAY,QAAQ,SAAS,YAAY;AAAA,MAC3D,UAAU,QAAQ,YAAY,QAAQ,SAAS,YAAY;AAAA,MAC3D,SAAS,QAAQ,WAAW;AAAA,MAC5B,WAAW,QAAQ,YAAY,CAAC,GAAG;AAAA,IACrC;AACA,QAAI,OAAQ,QAAO,KAAK,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC;AAChE,WAAO;AAAA,QAAuB,OAAO,EAAE,eAAe,OAAO,QAAQ,eAAe,OAAO,QAAQ,GAAG,OAAO,UAAU,cAAc,OAAO,OAAO,KAAK,EAAE,eAAe,OAAO,QAAQ;AAAA,EAC1L;AAGA,QAAM,OAAO,MAAM,UAAU,YAAY;AACzC,QAAM,UAAiB,MAAM,WAAW,CAAC;AAEzC,MAAI,QAAQ;AACV,WAAO,KAAK,UAAU;AAAA,MACpB,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,QAC3B,IAAI,EAAE;AAAA,QACN,UAAU,EAAE,YAAY;AAAA,QACxB,UAAU,EAAE,YAAY;AAAA,QACxB,UAAU,EAAE,YAAY;AAAA,QACxB,SAAS,EAAE,WAAW;AAAA,QACtB,eAAe,EAAE,KAAK,aAAa;AAAA,QACnC,eAAe,EAAE,gBAAgB;AAAA,MACnC,EAAE;AAAA,IACJ,GAAG,MAAM,CAAC;AAAA,EACZ;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC/B,UAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE;AAC5B,QAAI,EAAE,SAAU,OAAM,KAAK,aAAa,EAAE,QAAQ,EAAE;AACpD,QAAI,EAAE,SAAU,OAAM,KAAK,aAAa,EAAE,QAAQ,EAAE;AACpD,QAAI,EAAE,SAAU,OAAM,KAAK,aAAa,EAAE,QAAQ,EAAE;AACpD,QAAI,EAAE,QAAS,OAAM,KAAK,YAAY,EAAE,OAAO,EAAE;AACjD,QAAI,EAAE,KAAK,aAAa,KAAM,OAAM,KAAK,QAAQ,EAAE,IAAI,YAAY,QAAQ,IAAI,EAAE;AACjF,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB,CAAC;AACD,SAAO,YAAY,QAAQ,MAAM;AAAA,EAAO,MAAM,KAAK,IAAI,CAAC;AAC1D;;;AC9DO,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAEA,eAAsB,SACpB,WACA,MACiB;AACjB,QAAM,QAAQ,KAAK,SAAS;AAE5B,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAMC,UAAS,MAAM,UAAU,QAAQ,aAAa;AAAA,MAClD,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;AAAA,MAC9D,WAAW;AAAA,IACb,CAAC;AACD,UAAMC,aAAY,8BAA8BD,SAA+B;AAAA,MAC7E,KAAK,SAAS,KAAK,cAAc,YAAY;AAAA,MAC7C,UAAU;AAAA,MACV,4BAA4B;AAAA,IAC9B,CAAC;AACD,WAAO,iBAAiBC,YAAW,KAAK,YAAY,KAAK,QAAQ,OAAO,KAAK,OAAO;AAAA,EACtF;AAEA,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,QAAM,WAAW,KAAK,aAAa,GAAG,KAAK,SAAS,YAAY,KAAK,UAAU,KAAK,KAAK;AACzF,QAAM,SAAS,MAAM,UAAU,SAAS,UAAU,EAAE,OAAO,WAAW,KAAK,WAAW,CAAC;AACvF,QAAM,YAAY,8BAA8B,QAA+B;AAAA,IAC7E,KAAK,SAAS,KAAK,SAAS,IAAI,KAAK,cAAc,YAAY;AAAA,IAC/D,UAAU;AAAA,IACV,4BAA4B;AAAA,EAC9B,CAAC;AACD,SAAO,iBAAiB,WAAW,KAAK,YAAY,KAAK,QAAQ,OAAO,KAAK,OAAO;AACtF;AAEA,SAAS,iBAAiB,QAAa,WAAoB,QAA0B,QAAQ,IAAI,UAAU,OAAe;AACxH,MAAI,CAAC,QAAQ,WAAW,QAAQ,OAAO;AACrC,QAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,OAAO,OAAO,UAAU,CAAC,EAAE,GAAG,MAAM,CAAC;AAC3F,WAAO,UAAU,OAAO,KAAK;AAAA,EAC/B;AAEA,QAAM,WAAkB,QAAQ,YAAY,QAAQ,MAAM,YAAY,CAAC;AACvE,QAAM,SAAS,EAAE,GAAG,QAAQ,SAAS;AACrC,QAAM,iBAAiB,UAAU,mBAAmB,QAAQ,EAAE,WAAW,aAAa,MAAM,MAAM,CAAC,IAAI;AACvG,QAAM,iBAAiB,UAAU,eAAe,WAAW;AAE3D,MAAI,WAAW,QAAQ;AACrB,QAAI,WAAW,gBAAgB;AAC7B,aAAO,KAAK,UAAU;AAAA,QACpB,YAAY,aAAa;AAAA,QACzB,GAAG;AAAA,QACH,GAAI,QAAQ,kBAAkB,EAAE,iBAAiB,OAAO,gBAAyC,IAAI,CAAC;AAAA,QACtG,UAAU,eAAe,SAAS,IAAI,CAAC,OAAY;AAAA,UACjD,MAAM,EAAE;AAAA,UACR,MAAM,EAAE,QAAQ;AAAA,UAChB,SAAS,eAAe,CAAC;AAAA,UACzB,WAAW,EAAE,aAAa;AAAA,QAC5B,EAAE;AAAA,MACJ,GAAG,MAAM,CAAC;AAAA,IACZ;AACA,WAAO,KAAK,UAAU;AAAA,MACpB,YAAY,aAAa;AAAA,MACzB,GAAI,QAAQ,kBAAkB,EAAE,iBAAiB,OAAO,gBAAyC,IAAI,CAAC;AAAA,MACtG,UAAU,eAAe,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAY;AAAA,QACtD,MAAM,EAAE;AAAA,QACR,MAAM,EAAE,QAAQ;AAAA,QAChB,SAAS,eAAe,CAAC;AAAA,QACzB,WAAW,EAAE,aAAa;AAAA,MAC5B,EAAE;AAAA,IACJ,GAAG,MAAM,CAAC;AAAA,EACZ;AAEA,OAAK,WAAW,UAAU,WAAW,WAAc,WAAW,gBAAgB;AAC5E,UAAMC,SAAQ,eAAe,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAW;AACzD,YAAM,OAAO,EAAE,SAAS,SAAS,SAAS,EAAE,SAAS,cAAc,UAAU,EAAE;AAC/E,YAAM,UAAU,eAAe,CAAC;AAChC,YAAM,YAAY,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,WAAM;AACvE,aAAO,IAAI,IAAI,KAAK,SAAS;AAAA,IAC/B,CAAC;AACD,QAAI,eAAe,SAAS;AAC1B,YAAM,mBAAmB,eAAe,QAAQ,SAAS,MACrD,GAAG,eAAe,QAAQ,MAAM,GAAG,GAAG,CAAC,WACvC,eAAe;AACnB,MAAAA,OAAM,KAAK,aAAa,gBAAgB,EAAE;AAAA,IAC5C;AACA,QAAI,QAAQ,iBAAiB;AAC3B,MAAAA,OAAM,KAAK,aAAc,OAAO,gBAA0C,OAAO,EAAE;AAAA,IACrF;AACA,WAAOA,OAAM,SAAS,IAAIA,OAAM,KAAK,MAAM,IAAI;AAAA,EACjD;AAEA,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,QAAQ,kBACX;AAAA;AAAA,YAAsC,OAAO,gBAA0C,OAAO,KAC9F;AAAA,EACN;AACA,QAAM,QAAQ,eAAe,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAW;AACzD,UAAM,OAAO,EAAE,SAAS,SAAS,SAAS,EAAE,SAAS,cAAc,UAAU,EAAE;AAC/E,UAAM,UAAU,eAAe,CAAC;AAChC,UAAM,YAAY,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,WAAM;AACvE,WAAO,IAAI,IAAI,KAAK,SAAS;AAAA,EAC/B,CAAC;AACD,MAAI,QAAQ,iBAAiB;AAC3B,UAAM,KAAK,aAAc,OAAO,gBAA0C,OAAO,EAAE;AAAA,EACrF;AACA,SAAO,MAAM,KAAK,MAAM;AAC1B;;;ACnIO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,MAAM,CAAC,eAAe,QAAQ;AAAA,QAC9B,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC,YAAY;AAAA,EACzB;AACF;AAEA,eAAsB,cACpB,WACA,MAQiB;AACjB,QAAM,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,WAAW,KAAK,IAAI;AACjF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,wBAAwB;AAExD,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,WAAW,KAAK,aAAa,WAAW,WAAW;AACzD,QAAM,cAAc;AAAA,IAClB,iBAAiB;AAAA,IACjB;AAAA,IACA,GAAI,KAAK,aAAa,EAAE,WAAW,KAAK,YAAY,cAAc,KAAK,WAAW,IAAI,CAAC;AAAA,IACvF,GAAI,aAAa,gBAAgB,EAAE,UAAU,cAAc,IAAI,CAAC;AAAA,EAClE;AAEA,MAAI;AACJ,MAAI,iBAAiB,SAAS,GAAG;AAC/B,aAAS,MAAM,UAAU,QAAQ,yBAAyB,WAAW;AAAA,EACvE,OAAO;AACL,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,UAAM,WAAW,GAAG,KAAK,SAAS,YAAY,SAAS;AACvD,aAAS,MAAM,UAAU,mBAAmB,UAAU;AAAA,MACpD;AAAA,MACA,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,sBAAsB,QAAQ,EAAE,WAAW,UAAU,QAAQ,KAAK,OAAO,CAAC;AACnF;AAEO,SAAS,sBACd,QACA,SACQ;AACR,MAAI,CAAC,QAAQ,WAAW,QAAQ,OAAO;AACrC,QAAI,QAAQ,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AACrG,WAAO,UAAU,OAAO,KAAK;AAAA,EAC/B;AAEA,MAAI,QAAQ,WAAW,QAAQ;AAC7B,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAEA,MAAI,QAAQ,aAAa,eAAe;AACtC,UAAM,UAAU,OAAO,WAAW,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,CAAC;AACzF,WAAO;AAAA,MACL;AAAA,MACA,eAAe,QAAQ,SAAS;AAAA,MAChC,cAAc,OAAO,OAAO,YAAY,EAAE,CAAC;AAAA,MAC3C,eAAe,OAAO,OAAO,aAAa,EAAE,CAAC;AAAA,MAC7C,eAAe,OAAO,OAAO,aAAa,EAAE,CAAC;AAAA,MAC7C,eAAe,OAAO,OAAO,aAAa,EAAE,CAAC;AAAA,MAC7C,qBAAqB,OAAQ,QAAgB,kBAAkB,EAAE,CAAC;AAAA,MAClE,6BAA6B,OAAQ,QAAgB,yBAAyB,EAAE,CAAC;AAAA,MACjF,eAAe,OAAQ,QAAgB,aAAa,EAAE,CAAC;AAAA,MACvD,sBAAsB,OAAQ,QAAgB,mBAAmB,EAAE,CAAC;AAAA,IACtE,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,MAAI,OAAO,QAAQ,SAAS,SAAU,QAAO,OAAO;AACpD,MAAI,QAAQ,OAAQ,QAAO,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC;AAChE,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;;;ACzGO,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACtB;AACF;AAEA,eAAsB,SACpB,WACA,MACiB;AACjB,MAAI,CAAC,KAAK,SAAS,KAAK,EAAG,OAAM,IAAI,MAAM,qBAAqB;AAEhE,MAAI,iBAAiB,SAAS,GAAG;AAE/B,UAAMC,UAAS,MAAM,UAAU,QAAQ,aAAa;AAAA,MAClD,SAAS,KAAK;AAAA,MACd,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;AAAA,IAChE,CAAC;AACD,QAAIA,SAAQ,YAAY,MAAO,QAAO,UAAUA,QAAO,SAAS,kBAAkB;AAClF,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,QAAM,WAAW,KAAK,aAAa,GAAG,KAAK,SAAS,YAAY,KAAK,UAAU,KAAK,KAAK;AACzF,QAAM,SAAS,MAAM,UAAU,SAAS,UAAU,KAAK,SAAS;AAAA,IAC9D,GAAI,KAAK,aAAa,EAAE,WAAW,KAAK,WAAW,IAAI,CAAC;AAAA,EAC1D,CAAC;AACD,MAAI,QAAQ,YAAY,MAAO,QAAO,UAAU,OAAO,SAAS,kBAAkB;AAClF,SAAO;AACT;;;AC/CO,IAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC,WAAW,QAAQ;AAAA,QAC1B,aAAa;AAAA,MACf;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,QAAQ;AAAA,EACrB;AACF;AAEA,eAAsB,QACpB,WACA,MACiB;AACjB,QAAM,SAAS,KAAK,WAAW,WAAW,WAAW;AAErD,MAAI,iBAAiB,SAAS,GAAG;AAE/B,UAAMC,UAAS,MAAM,UAAU,QAAQ,kBAAkB;AAAA,MACvD;AAAA,MACA,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;AAAA,IAChE,CAAC;AACD,QAAIA,SAAQ,YAAY,MAAO,QAAO,UAAUA,QAAO,SAAS,uBAAuB;AACvF,WAAO,UAAU,MAAM;AAAA,EACzB;AAGA,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,QAAM,WAAW,KAAK,aAAa,GAAG,KAAK,SAAS,YAAY,KAAK,UAAU,KAAK,KAAK;AACzF,QAAM,SAAS,MAAM,UAAU,QAAQ,UAAU,MAAM;AACvD,MAAI,QAAQ,YAAY,MAAO,QAAO,UAAU,OAAO,SAAS,gBAAgB;AAChF,SAAO,UAAU,MAAM;AACzB;;;AC9CO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAEA,eAAsB,WACpB,WACA,MAC6F;AAC7F,MAAI;AAEJ,MAAI,iBAAiB,SAAS,GAAG;AAC/B,aAAS,MAAM,UAAU,QAAQ,cAAc;AAAA,MAC7C,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;AAAA,IAChE,CAAC;AAAA,EACH,OAAO;AAEL,WAAO,EAAE,MAAM,QAAQ,MAAM,0GAA0G;AAAA,EACzI;AAEA,MAAI,QAAQ,YAAY,OAAO;AAC7B,WAAO,EAAE,MAAM,QAAQ,MAAM,UAAU,OAAO,SAAS,mBAAmB,GAAG;AAAA,EAC/E;AAEA,QAAM,MAA0B,QAAQ,UAAU,QAAQ,cAAc,QAAQ;AAChF,MAAI,CAAC,KAAK;AACR,WAAO,EAAE,MAAM,QAAQ,MAAM,kDAAkD;AAAA,EACjF;AAEA,QAAM,WAAW,QAAQ,WAAW,QAAQ,cAAc;AAC1D,SAAO,EAAE,MAAM,SAAS,MAAM,KAAK,SAAS;AAC9C;;;AC3CO,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAEA,eAAsB,UACpB,WACA,MACiB;AACjB,MAAI;AACJ,MAAI;AAEJ,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,eAAe,MAAM,UAAU,QAAQ,cAAc;AAAA,MACzD,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,aAAS,cAAc,UAAU;AAEjC,QAAI,KAAK,iBAAiB,OAAO;AAC/B,YAAM,aAAa,MAAM,UAAU,QAAQ,oBAAoB;AAAA,QAC7D,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,oBAAc,YAAY,eAAe;AAAA,IAC3C;AAAA,EACF,OAAO;AACL,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,UAAM,SAAS,MAAM,UAAU;AAAA,MAC7B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,QAAQ,OAAO;AACjB,UAAI,KAAK,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AAClF,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AACA,aAAS,QAAQ;AACjB,kBAAc,QAAQ;AAAA,EACxB;AAEA,MAAI,QAAQ,YAAY,SAAS,QAAQ,QAAQ;AAC/C,UAAM,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAC/C,QAAI,KAAK,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC;AACzE,WAAO,cAAc,GAAG;AAAA,EAC1B;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,QAAI,KAAK,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,yBAAyB,KAAK,SAAS,GAAG,GAAG,MAAM,CAAC;AAC/G,WAAO,yBAAyB,KAAK,SAAS;AAAA,EAChD;AAEA,MAAI,KAAK,WAAW,QAAQ;AAC1B,UAAM,QAAQ,aAAa,OAAO,IAAI,CAAC,OAAY;AAAA,MACjD,MAAM,EAAE;AAAA,MACR,UAAU,EAAE,WAAW;AAAA,MACvB,QAAQ,EAAE,UAAU;AAAA,MACpB,YAAY,EAAE,cAAc;AAAA,MAC5B,WAAW,EAAE,aAAa;AAAA,IAC5B,EAAE,KAAK,CAAC;AACR,WAAO,KAAK,UAAU;AAAA,MACpB,QAAQ,OAAO,UAAU;AAAA,MACzB,aAAa,OAAO,cAAc;AAAA,MAClC,cAAc,OAAO,eAAe;AAAA,MACpC,OAAO,OAAO,SAAS;AAAA,MACvB,QAAQ,OAAO,UAAU;AAAA,MACzB,QAAQ,OAAO,UAAU;AAAA,MACzB,UAAU,OAAO,YAAY;AAAA,MAC7B,WAAW,OAAO,aAAa;AAAA,MAC/B,SAAS,OAAO,WAAW;AAAA,MAC3B,aAAa,OAAO,cAAc;AAAA,MAClC,eAAe,OAAO,gBAAgB;AAAA,MACtC,OAAO,OAAO,SAAS;AAAA,MACvB,eAAe;AAAA,MACf,kBAAkB,aAAa,mBAAmB;AAAA,MAClD,iBAAiB,aAAa,kBAAkB;AAAA,IAClD,GAAG,MAAM,CAAC;AAAA,EACZ;AAEA,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,OAAQ,OAAM,KAAK,WAAW,OAAO,MAAM,EAAE;AACxD,MAAI,OAAO,YAAY;AACrB,UAAM,KAAK,SAAS,OAAO,WAAW,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,cAAc,WAAM,OAAO,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;AAAA,EACzH;AACA,MAAI,OAAO,QAAQ,EAAG,OAAM,KAAK,UAAU,OAAO,KAAK,EAAE;AACzD,MAAI,OAAO,SAAS,EAAG,OAAM,KAAK,WAAW,OAAO,MAAM,EAAE;AAC5D,MAAI,OAAO,SAAS,EAAG,OAAM,KAAK,WAAW,OAAO,MAAM,EAAE;AAC5D,MAAI,OAAO,WAAW,EAAG,OAAM,KAAK,aAAa,OAAO,QAAQ,EAAE;AAClE,MAAI,OAAO,YAAY,EAAG,OAAM,KAAK,cAAc,OAAO,SAAS,EAAE;AACrE,MAAI,OAAO,UAAU,EAAG,OAAM,KAAK,YAAY,OAAO,OAAO,EAAE;AAC/D,MAAI,OAAO,aAAa,EAAG,OAAM,KAAK,YAAY,OAAO,UAAU,EAAE;AACrE,MAAI,OAAO,aAAc,OAAM,KAAK,gBAAgB;AACpD,MAAI,CAAC,OAAO,MAAO,OAAM,KAAK,qBAAqB;AAEnD,MAAI,aAAa,OAAO,SAAS,GAAG;AAClC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,kBAAkB,YAAY,MAAM,MAAM,IAAI;AACzD,eAAW,KAAK,YAAY,MAAM,MAAM,GAAG,EAAE,GAAG;AAC9C,YAAM,KAAK,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,UAAU,SAAS,EAAE,OAAO,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,EAAE;AAAA,IACzK;AACA,QAAI,YAAY,MAAM,SAAS,GAAI,OAAM,KAAK,gBAAW,YAAY,MAAM,SAAS,EAAE,OAAO;AAC7F,QAAI,YAAY,mBAAmB,YAAY,gBAAgB;AAC7D,YAAM,KAAK,WAAW,YAAY,mBAAmB,CAAC,KAAK,YAAY,kBAAkB,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC3HO,IAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAEA,eAAsB,OACpB,WACA,MASiB;AACjB,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;AAEzD,MAAI;AACJ,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,MAAM,UAAU,QAAQ,WAAW;AAAA,MACvC,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACvC,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MAC1C,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IAC5C,CAAC;AACD,UAAM,KAAK,OAAO;AAAA,EACpB,OAAO;AACL,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,UAAM,SAAS,MAAM,UAAU,OAAO,KAAK,WAAW,KAAK,WAAW;AAAA,MACpE;AAAA,MACA,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,IACd,CAAC;AACD,UAAM,QAAQ,OAAO;AAAA,EACvB;AAEA,MAAI,KAAK,YAAY,SAAS,KAAK,QAAQ;AACzC,UAAM,MAAM,KAAK,SAAS,KAAK,UAAU;AACzC,QAAI,KAAK,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC;AACzE,WAAO,kBAAkB,GAAG;AAAA,EAC9B;AAEA,MAAI,CAAC,KAAK,WAAW;AACnB,UAAM,MAAM,yBAAyB,KAAK,SAAS;AACnD,QAAI,KAAK,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,UAAiB,KAAK,WAAW,CAAC;AAExC,MAAI,KAAK,WAAW,QAAQ;AAC1B,WAAO,KAAK,UAAU;AAAA,MACpB,WAAW,IAAI;AAAA,MACf,QAAQ,IAAI,UAAU;AAAA,MACtB,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,QAC3B,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,QAAQ,MAAM,GAAG,CAAC;AAAA,QAC3B,SAAS,EAAE;AAAA,QACX,QAAQ,EAAE,cAAc;AAAA,QACxB,cAAc,EAAE,eAAe;AAAA,QAC/B,aAAa,EAAE,aAAa,IAAI,KAAK,EAAE,UAAU,EAAE,YAAY,IAAI;AAAA,MACrE,EAAE;AAAA,MACF,OAAO,QAAQ;AAAA,MACf,WAAW,IAAI,aAAa;AAAA,IAC9B,GAAG,MAAM,CAAC;AAAA,EACZ;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC/B,UAAM,OAAO,EAAE,QAAQ,MAAM,GAAG,CAAC,KAAK;AACtC,UAAM,OAAO,EAAE,aAAa,IAAI,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAChF,UAAM,SAAS,EAAE,aAAa,KAAK,EAAE,UAAU,MAAM;AACrD,WAAO,GAAG,IAAI,IAAI,IAAI,GAAG,MAAM,IAAI,EAAE,OAAO;AAAA,EAC9C,CAAC;AAED,QAAM,SAAS,YAAY,QAAQ,MAAM,GAAG,IAAI,YAAY,gBAAgB,EAAE;AAC9E,SAAO,GAAG,MAAM;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC;AACvC;;;ACnHO,IAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAYA,eAAsB,QACpB,WACA,MAQiB;AACjB,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,KAAM,KAAK,aAAa,GAAG,CAAC;AACnE,QAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO,aAAa,WAAW,KAAK,WAAW,KAAK,MAAM,UAAU,QAAQ,KAAK,MAAM;AAAA,EACzF;AAEA,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,QAAM,SAAS,MAAM,UAAU,QAAQ,KAAK,WAAW,KAAK,WAAW;AAAA,IACrE,MAAM,KAAK;AAAA,IACX;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,OAAO;AACjB,QAAI,KAAK,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AAClF,WAAO,mBAAmB,OAAO,KAAK;AAAA,EACxC;AAEA,SAAO,iBAAiB,QAAQ,KAAK,MAAM;AAC7C;AAEA,eAAe,aACb,WACA,WACA,MACA,UACA,QACA,QACiB;AACjB,MAAI,MAAM;AACR,UAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,EAAE,WAAW,MAAM,MAAM,OAAO,CAAC;AACtF,UAAM,IAAI,KAAK,QAAQ;AAEvB,QAAI,GAAG,YAAY,SAAS,GAAG,QAAQ;AACrC,YAAM,MAAM,GAAG,SAAS,GAAG,UAAU;AACrC,UAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC;AACpE,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AAEA,UAAM,SAAS,GAAG,QAAQ,IAAI,MAAM,IAAI;AACxC,UAAM,YAAY,MAAM,SAAS;AACjC,UAAM,SAAS;AAAA,MACb,OAAO,CAAC;AAAA,QACN,MAAM;AAAA,QACN,MAAM,YAAY,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI,IAAI,sBAAuB,GAAG,QAAQ;AAAA,QAC1F;AAAA,QACA,QAAQ,GAAG,UAAU;AAAA,MACvB,CAAC;AAAA,MACD,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,IACF;AACA,WAAO,iBAAiB,QAAQ,MAAM;AAAA,EACxC;AAGA,QAAM,aAAa,MAAM,UAAU,QAAQ,oBAAoB,EAAE,WAAW,OAAO,CAAC;AACpF,QAAM,UAAU,YAAY,eAAe;AAE3C,MAAI,SAAS,YAAY,SAAS,SAAS,QAAQ;AACjD,UAAM,MAAM,SAAS,SAAS,SAAS,UAAU;AACjD,QAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC;AACpE,WAAO,mBAAmB,GAAG;AAAA,EAC/B;AAEA,MAAI,CAAC,SAAS,WAAW;AACvB,UAAM,MAAM,yBAAyB,SAAS;AAC9C,QAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,IAAI,GAAG,MAAM,CAAC;AACpE,WAAO;AAAA,EACT;AAEA,QAAM,QAAe,SAAS,SAAS,CAAC;AACxC,MAAI,MAAM,WAAW,GAAG;AACtB,QAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,EAAE,OAAO,CAAC,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,MAAM,GAAG,MAAM,CAAC;AACrH,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,CAAC;AACjC,QAAM,YAA8B,MAAM,QAAQ;AAAA,IAChD,SAAS,IAAI,OAAO,MAAoC;AACtD,UAAI;AACF,cAAM,MAAM,MAAM,UAAU,QAAQ,iBAAiB,EAAE,WAAW,MAAM,EAAE,MAAM,OAAO,CAAC;AACxF,cAAM,IAAI,KAAK,QAAQ;AACvB,cAAM,SAAS,GAAG,QAAQ,IAAI,MAAM,IAAI;AACxC,cAAM,QAAQ,MAAM,SAAS;AAC7B,eAAO;AAAA,UACL,MAAM,EAAE;AAAA,UACR,UAAU,EAAE,WAAW;AAAA,UACvB,QAAQ,EAAE,UAAU;AAAA,UACpB,MAAM,QAAQ,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI,IAAI,sBAAuB,GAAG,QAAQ;AAAA,UACtF,WAAW;AAAA,UACX,QAAQ,GAAG,UAAU;AAAA,QACvB;AAAA,MACF,QAAQ;AACN,eAAO,EAAE,MAAM,EAAE,MAAM,MAAM,IAAI,WAAW,OAAO,QAAQ,OAAO,OAAO,eAAe;AAAA,MAC1F;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB;AAAA,IACtB,OAAO;AAAA,IACP,aAAa,MAAM;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,WAAW,MAAM,SAAS;AAAA,EAC5B,GAAG,MAAM;AACX;AAEA,SAAS,iBAAiB,QAAa,QAA6C;AAClF,MAAI,WAAW,OAAQ,QAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAE5D,QAAM,QAA0B,QAAQ,SAAS,CAAC;AAClD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,QAAkB,CAAC;AACzB,QAAM,aAAa,QAAQ,eAAe,MAAM;AAChD,QAAM,WAAW,QAAQ,eAAe,MAAM;AAC9C,MAAI,WAAW,YAAY;AACzB,UAAM,KAAK,WAAW,UAAU,OAAO,QAAQ;AAAA,CAAmB;AAAA,EACpE;AAEA,aAAW,KAAK,OAAO;AACrB,UAAM,SAAS,OAAO,EAAE,IAAI,GAAG,EAAE,WAAW,SAAS,EAAE,QAAQ,MAAM,EAAE;AACvE,QAAI,EAAE,OAAO;AACX,YAAM,KAAK,GAAG,MAAM;AAAA,UAAa,EAAE,KAAK;AAAA,CAAK;AAAA,IAC/C,WAAW,EAAE,QAAQ;AACnB,YAAM,KAAK,GAAG,MAAM;AAAA;AAAA,CAAmB;AAAA,IACzC,WAAW,CAAC,EAAE,MAAM;AAClB,YAAM,KAAK,GAAG,MAAM;AAAA;AAAA,CAAe;AAAA,IACrC,OAAO;AACL,YAAM,KAAK,GAAG,MAAM;AAAA,EAAK,EAAE,IAAI,GAAG,EAAE,YAAY,KAAK,IAAI,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AChMO,IAAM,sBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,aAAa,SAAS;AAAA,EACnC;AACF;AAEA,eAAsB,cACpB,WACA,MAMiB;AACjB,QAAM,UAAU,KAAK,SAAS,KAAK;AACnC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,SAAS,IAAK,QAAO;AAEjC,MAAI;AACJ,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,MAAM,UAAU,QAAQ,kBAAkB;AAAA,MAC9C,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,kBAAkB,KAAK,qBAAqB;AAAA,IAC9C,CAAC;AACD,UAAM,KAAK,cAAc;AAAA,EAC3B,OAAO;AACL,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,UAAM,SAAS,MAAM,UAAU,cAAc,KAAK,WAAW;AAAA,MAC3D,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,kBAAkB,KAAK,qBAAqB;AAAA,IAC9C,CAAC;AACD,UAAM,QAAQ,cAAc;AAAA,EAC9B;AAEA,MAAI,KAAK,YAAY,SAAS,KAAK,QAAQ;AACzC,UAAM,MAAM,KAAK,SAAS,KAAK,UAAU;AACzC,QAAI,IAAI,SAAS,mBAAmB,KAAK,IAAI,SAAS,mBAAmB,GAAG;AAC1E,aAAO;AAAA,IACT;AACA,WAAO,yBAAyB,GAAG;AAAA,EACrC;AAEA,QAAM,SAAS,KAAK,QAAQ,MAAM,GAAG,CAAC,KAAK;AAC3C,QAAM,UAAU,KAAK,WAAW,sBAAsB,OAAO;AAC7D,SAAO,uBAAuB,MAAM,WAAM,OAAO;AACnD;;;ACxEO,IAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EAIF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AACF;AAEA,eAAsB,QACpB,WACA,MAMiB;AACjB,MAAI;AAEJ,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,MAAM,UAAU,QAAQ,YAAY;AAAA,MACxC,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK,UAAU;AAAA,MACvB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC/C,CAAC;AACD,UAAM,KAAK,QAAQ;AAAA,EACrB,OAAO;AACL,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,UAAM,SAAS,MAAM,UAAU,QAAQ,KAAK,WAAW;AAAA,MACrD,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,UAAM,QAAQ,QAAQ;AAAA,EACxB;AAEA,MAAI,KAAK,YAAY,SAAS,KAAK,QAAQ;AACzC,UAAM,MAAM,KAAK,SAAS,KAAK,UAAU;AACzC,WAAO,mBAAmB,GAAG;AAAA,EAC/B;AAEA,QAAM,SAAS,KAAK,UAAU,KAAK,UAAU;AAC7C,QAAM,SAAS,KAAK,UAAU,KAAK,UAAU;AAC7C,QAAM,YAAY,KAAK,YAAY,kBAAkB;AACrD,QAAM,SAAS,KAAK,SAAS;AAAA,EAAK,IAAI,MAAM,KAAK;AAEjD,SAAO,UAAU,MAAM,WAAM,MAAM,GAAG,SAAS,GAAG,MAAM;AAC1D;;;ACrEO,IAAM,sBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,MAAM;AAAA,EACnB;AACF;AAEA,eAAsB,cACpB,WACA,MACiB;AACjB,MAAI,iBAAiB,SAAS,GAAG;AAE/B,UAAM,aACJ,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS;AAC5E,UAAM,cAAc,aAAa,eAAe;AAChD,UAAM,UAAmC,aACrC,EAAE,SAAS,KAAK,MAAM,KAAK,KAAK,aAAa,KAAK,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC,EAAG,IAC/F,EAAE,SAAS,KAAK,MAAM,WAAW,KAAK;AAC1C,UAAMC,UAAS,MAAM,UAAU,QAAQ,aAAa,OAAO;AAC3D,QAAIA,SAAQ,YAAY,MAAO,QAAO,UAAUA,QAAO,SAAS,eAAe;AAC/E,UAAMC,MAAKD,SAAQ,MAAMA,SAAQ;AACjC,WAAOC,MAAK,yBAAyBA,GAAE,WAAW,KAAK,IAAI,KAAK,aAAa,KAAK,UAAUD,OAAM,CAAC;AAAA,EACrG;AAGA,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,QAAM,SAAS,MAAM,UAAU,OAAO,KAAK,WAAW;AAAA,IACpD,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,EACd,CAAC;AACD,MAAI,QAAQ,YAAY,SAAS,QAAQ,MAAO,QAAO,UAAU,OAAO,SAAS,eAAe;AAChG,QAAM,KAAK,QAAQ,MAAM,QAAQ;AACjC,SAAO,KAAK,yBAAyB,EAAE,WAAW,KAAK,IAAI,KAAK,aAAa,KAAK,UAAU,MAAM,CAAC;AACrG;;;ACzDO,IAAM,oBAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,aACE;AAAA,EAEF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAU,CAAC,YAAY;AAAA,EACzB;AACF;AAEA,eAAsB,YACpB,WACA,MACiB;AACjB,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,QAAQ;AACd,QAAI,eAAe,KAAK;AAGxB,QAAI,CAAC,cAAc;AACjB,YAAM,SAAS,MAAM,MAAM,UAAU;AACrC,YAAM,WAAW,QAAQ,YAAY,CAAC,GAAG,KAAK,CAAC,MAAW,EAAE,OAAO,KAAK,UAAU;AAClF,qBAAe,SAAS,gBAAgB,SAAS;AAAA,IACnD;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO,6CAA6C,KAAK,UAAU;AAAA,IACrE;AAEA,UAAME,UAAS,MAAM,MAAM,QAAQ,YAAY;AAAA,MAC7C,iBAAiB,KAAK;AAAA,MACtB,SAAS;AAAA,IACX,CAAC;AACD,QAAIA,SAAQ,YAAY,MAAO,QAAO,UAAUA,QAAO,SAAS,aAAa;AAC7E,WAAO,WAAW,KAAK,UAAU;AAAA,EACnC;AAGA,MAAI,CAAC,KAAK,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAC1E,QAAM,SAAS,MAAM,UAAU,KAAK,KAAK,WAAW;AAAA,IAClD,IAAI,KAAK;AAAA,IACT,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,EACzC,CAAC;AACD,MAAI,QAAQ,YAAY,SAAS,QAAQ,MAAO,QAAO,UAAU,OAAO,SAAS,aAAa;AAC9F,SAAO,WAAW,KAAK,UAAU;AACnC;;;AC5DO,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAEA,eAAsB,aACpB,WACA,MACiB;AACjB,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO,kBAAkB,WAAW,KAAK,MAAM;AAAA,EACjD;AACA,SAAO,kBAAkB,WAAW,KAAK,WAAW,KAAK,MAAM;AACjE;AAEA,eAAe,kBACb,WACA,QACiB;AACjB,QAAM,SAAS,MAAM,UAAU,UAAU;AACzC,QAAM,WAAkB,QAAQ,YAAY,CAAC;AAE7C,QAAM,UAAU,SAAS;AAAA,IACvB,CAAC,MAAM,EAAE,WAAW,sBAAsB,EAAE,gBAAgB;AAAA,EAC9D;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO,KAAK,UAAU;AAAA,MACpB,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,QAC3B,YAAY,EAAE;AAAA,QACd,WAAW,EAAE,aAAa;AAAA,QAC1B,MAAM,EAAE,gBAAgB;AAAA,QACxB,eAAe,EAAE,YAAY,aAAa,WAAW;AAAA,QACrD,SAAS,EAAE,YAAY,aAAa,WAAW,CAAC;AAAA,MAClD,EAAE;AAAA,IACJ,GAAG,MAAM,CAAC;AAAA,EACZ;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC/B,UAAM,QAAQ,EAAE,YAAY;AAC5B,UAAM,QAAQ,CAAC,eAAe,EAAE,EAAE,EAAE;AACpC,QAAI,EAAE,UAAW,OAAM,KAAK,cAAc,EAAE,SAAS,EAAE;AACvD,QAAI,EAAE,aAAc,OAAM,KAAK,SAAS,EAAE,YAAY,EAAE;AACxD,QAAI,OAAO,QAAS,OAAM,KAAK,WAAW,MAAM,OAAO,EAAE;AACzD,QAAI,OAAO,SAAS,OAAQ,OAAM,KAAK,YAAY,MAAM,QAAQ,KAAK,IAAI,CAAC,EAAE;AAC7E,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B,CAAC;AACD,SAAO,sBAAsB,QAAQ,MAAM;AAAA;AAAA,EAAS,MAAM,KAAK,MAAM,CAAC;AACxE;AAEA,eAAe,kBACb,WACA,UACA,QACiB;AACjB,QAAM,UAAqD,CAAC;AAE5D,MAAI,UAAU;AACZ,UAAM,eAAe,MAAM,UAAU,gBAAgB,QAAQ;AAC7D,UAAM,WAAkB,cAAc,YAAY,CAAC;AACnD,eAAW,KAAK,UAAU;AACxB,UAAI,EAAE,WAAW,mBAAoB,SAAQ,KAAK,EAAE,UAAU,SAAS,EAAE,CAAC;AAAA,IAC5E;AAAA,EACF,OAAO;AACL,UAAM,OAAO,MAAM,UAAU,YAAY;AACzC,UAAM,UAAiB,MAAM,WAAW,CAAC;AAGzC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,YAAM,QAAQ;AAAA,QACZ,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,OAAO,MAAM;AACvC,cAAI;AACF,kBAAM,eAAe,MAAM,UAAU,gBAAgB,EAAE,EAAE;AACzD,kBAAM,WAAkB,cAAc,YAAY,CAAC;AACnD,uBAAW,KAAK,UAAU;AACxB,kBAAI,EAAE,WAAW,mBAAoB,SAAQ,KAAK,EAAE,UAAU,EAAE,IAAI,SAAS,EAAE,CAAC;AAAA,YAClF;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAO,KAAK,UAAU;AAAA,MACpB,SAAS,QAAQ,IAAI,CAAC,EAAE,UAAU,KAAK,SAAS,EAAE,OAAO;AAAA,QACvD,WAAW;AAAA,QACX,YAAY,EAAE;AAAA,QACd,WAAW,EAAE,aAAa;AAAA,QAC1B,MAAM,EAAE,gBAAgB;AAAA,QACxB,eAAe;AAAA,QACf,SAAS,CAAC;AAAA,MACZ,EAAE;AAAA,IACJ,GAAG,MAAM,CAAC;AAAA,EACZ;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,QAAQ,QAAQ,IAAI,CAAC,EAAE,UAAU,KAAK,SAAS,EAAE,MAAM;AAC3D,UAAM,QAAQ,CAAC,cAAc,GAAG,IAAI,eAAe,EAAE,EAAE,EAAE;AACzD,QAAI,EAAE,UAAW,OAAM,KAAK,cAAc,EAAE,SAAS,EAAE;AACvD,QAAI,EAAE,aAAc,OAAM,KAAK,SAAS,EAAE,YAAY,EAAE;AACxD,UAAM,KAAK,4CAA4C;AACvD,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B,CAAC;AACD,SAAO,sBAAsB,QAAQ,MAAM;AAAA;AAAA,EAAS,MAAM,KAAK,MAAM,CAAC;AACxE;;;AjBlEA,eAAsB,+BAA+B,MAA4B;AAC/E,MAAI;AACF,UAAM,EAAE,6BAA6B,IAAI,MAAM,OAAO,qBAAqB;AAC3E,WAAO,6BAA6B,EAAE,KAAK,CAAC;AAAA,EAC9C,SAAS,GAAQ;AACf,UAAM,IAAI,MAAM,iDAAiD,GAAG,WAAW,OAAO,CAAC,CAAC,EAAE;AAAA,EAC5F;AACF;AAEA,eAAsB,eAAe,MAA6C;AAChF,QAAM,YACJ,KAAK,SAAS,UACV,IAAI,eAAe,EAAE,QAAQ,KAAK,QAAS,SAAS,KAAK,QAAQ,CAAC,IAClE,KAAK,SAAS,QACZ,IAAI,aAAa,EAAE,MAAM,KAAK,KAAK,CAAC,IACpC,IAAI,eAAe,EAAE,MAAM,KAAK,MAAM,UAAU,KAAK,SAAS,CAAC;AAGvE,QAAM,QAAQ,MAAM,UAAU,KAAK;AACnC,MAAI,CAAC,OAAO;AACV,UAAM,OACJ,KAAK,SAAS,UACV,qGACA,KAAK,SAAS,QACZ,kFACA;AACR,YAAQ,OAAO,MAAM,6BAA6B,KAAK,IAAI,YAAY,IAAI;AAAA,CAAI;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,KAAK,SAAS;AAG9B,MAAI,KAAK,QAAQ;AACf,QAAI;AAGJ,QAAI,CAAC,QAAQ,QAAQ,IAAI,oBAAoB;AAC3C,UAAI;AACF,eAAO,KAAK,MAAM,QAAQ,IAAI,kBAAkB;AAChD,gBAAQ,OAAO,MAAM;AAAA,CAA+D;AAAA,MACtF,SAAS,GAAQ;AACf,gBAAQ,OAAO,MAAM,oDAAoD,EAAE,OAAO;AAAA,CAAI;AAAA,MACxF;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,KAAK,SAAS,WAAW,KAAK,QAAQ;AACjD,UAAI;AACF,cAAM,OAAO,KAAK,WAAW;AAC7B,cAAM,MAAM,MAAM,MAAM,GAAG,IAAI,uBAAuB,KAAK,MAAM,IAAI;AAAA,UACnE,SAAS,EAAE,iBAAiB,UAAU,KAAK,MAAM,IAAI,gBAAgB,mBAAmB;AAAA,QAC1F,CAAC;AACD,YAAI,IAAI,IAAI;AACV,gBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,gBAAM,KAAK,KAAK;AAChB,gBAAM,QAAQ,KAAK,SAAS,CAAC;AAE7B,cAAI,SAAc,CAAC;AACnB,cAAI;AAAE,qBAAS,KAAK,MAAM,GAAG,eAAe,GAAG,UAAU,IAAI;AAAA,UAAG,QAAQ;AAAA,UAAQ;AAChF,cAAI,cAAmB,CAAC;AACxB,cAAI;AAAE,0BAAc,KAAK,MAAM,GAAG,oBAAoB,GAAG,sBAAsB,IAAI;AAAA,UAAG,QAAQ;AAAA,UAAQ;AACtG,iBAAO;AAAA,YACL,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT,cAAc,GAAG;AAAA,YACjB,eAAe,GAAG;AAAA,YAClB,eAAe,GAAG;AAAA,YAClB,QAAQ;AAAA,cACN,0BAA0B;AAAA,cAC1B,2BAA2B;AAAA,cAC3B,wBAAwB;AAAA,cACxB,sCAAsC;AAAA,cACtC,kCAAkC;AAAA,cAClC,wBAAwB;AAAA,cACxB,kBAAkB;AAAA,cAClB,0BAA0B;AAAA,cAC1B,GAAG;AAAA,YACL;AAAA,YACA;AAAA,YACA,OAAO,MAAM,IAAI,CAAC,OAAY;AAAA,cAC5B,IAAI,EAAE;AAAA,cACN,WAAW,EAAE;AAAA,cACb,UAAU,EAAE;AAAA,cACZ,UAAU,EAAE;AAAA,cACZ,eAAe,CAAC;AAAA,cAChB,QAAQ,CAAC;AAAA,cACT,iBAAiB;AAAA,YACnB,EAAE;AAAA,YACF,WAAW,GAAG;AAAA,YACd,WAAW,GAAG;AAAA,UAChB;AACA,kBAAQ,OAAO,MAAM;AAAA,CAAkD;AAAA,QACzE;AAAA,MACF,SAAS,GAAQ;AACf,gBAAQ,OAAO,MAAM,gEAAgE,EAAE,OAAO;AAAA,CAAI;AAAA,MACpG;AAAA,IACF;AAGA,QAAI,CAAC,MAAM;AACT,UAAI;AACF,cAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,qBAAqB;AACtD,eAAO,QAAQ,KAAK,MAAM;AAAA,MAC5B,SAAS,GAAQ;AACf,gBAAQ,OAAO,MAAM,iDAAiD,EAAE,OAAO;AAAA,CAAI;AAAA,MACrF;AAAA,IACF;AAIA,QAAI,CAAC,SAAS,qBAAqB,kBAAkB,qBAAqB,eAAe;AACvF,UAAI;AACF,cAAM,SAAS,MAAM,UAAU,QAAQ,YAAY,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC1E,YAAI,QAAQ,WAAW,OAAO,MAAM;AAClC,iBAAO,OAAO;AACd,kBAAQ,OAAO,MAAM;AAAA,CAA+C;AAAA,QACtE;AAAA,MACF,SAAS,GAAQ;AACf,gBAAQ,OAAO,MAAM,0CAA0C,EAAE,OAAO;AAAA,CAAI;AAAA,MAC9E;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,cAAQ,OAAO,MAAM,sBAAsB,KAAK,MAAM,kBAAkB,KAAK,SAAS,UAAU,mBAAmB,OAAO;AAAA,CAA4D;AACtL,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACJ,QAAI;AACJ,QAAI,sBAA0C,eAAAC,QAAG,SAAS;AAE1D,QAAI,qBAAqB,kBAAkB,qBAAqB,cAAc;AAC5E,UAAI;AACF,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,qBAAqB;AACzD,cAAM,MAAM,WAAW;AACvB,YAAI,IAAI,oBAAqB,kBAAiB,IAAI;AAAA,MACpD,QAAQ;AAAA,MAAoB;AAAA,IAC9B;AAEA,QAAI,qBAAqB,cAAc;AACrC,UAAI;AACF,cAAM,eAAe,MAAM,UAAU,UAAU;AAC/C,cAAM,aAAa,OAAO,cAAc,QAAQ,eAAe,WAAW,aAAa,OAAO,WAAW,KAAK,IAAI;AAClH,cAAM,WAAW,OAAO,cAAc,QAAQ,aAAa,WACvD,aAAa,OAAO,SAAS,KAAK,IAClC,OAAO,cAAc,QAAQ,SAAS,aAAa,WACjD,aAAa,OAAO,QAAQ,SAAS,KAAK,IAC1C;AACN,YAAI,WAAY,iBAAgB;AAChC,YAAI,SAAU,uBAAsB;AAAA,MACtC,QAAQ;AAAA,MAA8D;AAAA,IACxE;AAEA,UAAM,UAAuB,EAAE,MAAM,WAAW,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC,GAAI,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC,GAAI,GAAI,sBAAsB,EAAE,oBAAoB,IAAI,CAAC,EAAG;AAEpM,UAAM,oBAAoB,MAAM,+BAA+B,IAAI;AAEnE,UAAMC,UAAS,IAAI;AAAA,MACjB,EAAE,MAAM,qBAAqB,SAAS,SAAS;AAAA,MAC/C,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE;AAAA,IAC/C;AAGA,UAAM,EAAE,4BAA4B,0BAA0B,IAAI,MAAM,OAAO,oCAAoC;AACnH,IAAAA,QAAO,kBAAkB,4BAA4B,aAAa;AAAA,MAChE,WAAW,CAAC;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,aAAa,2BAA2B,KAAK,IAAI;AAAA,QACjD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,EAAE;AACF,IAAAA,QAAO,kBAAkB,2BAA2B,OAAO,QAAQ;AACjE,UAAI,IAAI,OAAO,QAAQ,+BAA+B;AACpD,eAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,OAAO,KAAK,UAAU,cAAc,MAAM,kBAAkB,CAAC,EAAE;AAAA,MAChG;AACA,YAAM,IAAI,MAAM,qBAAqB,IAAI,OAAO,GAAG,EAAE;AAAA,IACvD,CAAC;AAED,IAAAA,QAAO,kBAAkB,qCAAwB,aAAa,EAAE,OAAO,eAAe,EAAE;AAExF,IAAAA,QAAO,kBAAkB,oCAAuB,OAAO,QAAQ;AAC7D,YAAM,EAAE,MAAM,WAAW,KAAK,IAAI,IAAI;AACtC,YAAM,IAAK,QAAQ,CAAC;AACpB,UAAI;AACF,YAAI;AACJ,gBAAQ,MAAM;AAAA,UACZ,KAAK;AAAe,mBAAO,MAAM,WAAW,OAAO;AAAG;AAAA,UACtD,KAAK;AAAmB,mBAAO,MAAM,cAAc,OAAO;AAAG;AAAA,UAC7D,KAAK;AAAqB,mBAAO,MAAM,gBAAgB,SAAS,CAAQ;AAAG;AAAA,UAC3E,KAAK;AAAmB,mBAAO,MAAM,cAAc,SAAS,CAAQ;AAAG;AAAA,UACvE,KAAK;AAAqB,mBAAO,MAAM,gBAAgB,SAAS,CAAQ;AAAG;AAAA,UAC3E,KAAK;AAAsB,mBAAO,MAAM,iBAAiB,SAAS,CAAQ;AAAG;AAAA,UAC7E,KAAK;AAAkB,mBAAO,MAAM,aAAa,SAAS,CAAQ;AAAG;AAAA,UACrE,KAAK;AAAkB,mBAAO,MAAM,aAAa,SAAS,CAAQ;AAAG;AAAA,UACrE,KAAK;AAAmB,mBAAO,MAAM,cAAc,SAAS,CAAQ;AAAG;AAAA,UACvE,KAAK;AAAuB,mBAAO,MAAM,kBAAkB,SAAS,CAAQ;AAAG;AAAA,UAC/E,KAAK;AAAmB,mBAAO,MAAM,cAAc,SAAS,CAAQ;AAAG;AAAA,UACvE,KAAK;AAA0B,mBAAO,MAAM,oBAAoB,SAAS,CAAQ;AAAG;AAAA,UACpF,KAAK;AAAmB,mBAAO,MAAM,eAAe,SAAS,CAAQ;AAAG;AAAA,UACxE,KAAK;AAAgB,mBAAO,MAAM,YAAY,SAAS,CAAQ;AAAG;AAAA,UAClE,KAAK;AAAmB,mBAAO,MAAM,cAAc,SAAS,CAAQ;AAAG;AAAA,UACvE,KAAK;AAAoB,mBAAO,MAAM,eAAe,SAAS,CAAQ;AAAG;AAAA,UACzE,KAAK;AAAoB,mBAAO,MAAM,eAAe,SAAS,CAAQ;AAAG;AAAA,UACzE,KAAK;AAA6B,mBAAO,MAAM,uBAAuB,OAAO;AAAG;AAAA,UAChF,KAAK;AAA+B,mBAAO,MAAM,yBAAyB,SAAS,CAAQ;AAAG;AAAA,UAC9F,KAAK;AAA8B,mBAAO,MAAM,wBAAwB,SAAS,CAAQ;AAAG;AAAA,UAC5F,KAAK;AAAoB,mBAAO,MAAM,eAAe,SAAS,CAAQ;AAAG;AAAA,UACzE,KAAK;AAAyB,mBAAO,MAAM,oBAAoB,SAAS,CAAQ;AAAG;AAAA,UACnF,KAAK;AAAqB,mBAAO,MAAM,gBAAgB,SAAS,CAAQ;AAAG;AAAA,UAC3E,KAAK;AAAyB,mBAAO,MAAM,oBAAoB,SAAS,CAAQ;AAAG;AAAA,UACnF;AAAS,mBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,QAC9F;AACA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,MAC7C,SAAS,KAAU;AACjB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,WAAW,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MACrG;AAAA,IACF,CAAC;AAED,UAAMC,kBAAiB,IAAI,kCAAqB;AAChD,UAAMD,QAAO,QAAQC,eAAc;AACnC,YAAQ,OAAO,MAAM,kCAAkC,KAAK,IAAI,2BAAsB,KAAK,IAAI,KAAK,KAAK,YAAY;AAAA,CAAK;AAC1H;AAAA,EACF;AAOA,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,UAAU,CAAC,eAAe,IAAI,CAAC;AAAA,EACrC;AAEA,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,qBAAqB,SAAS,SAAS;AAAA,IAC/C,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE;AAAA,EAChC;AAEA,SAAO,kBAAkB,qCAAwB,aAAa,EAAE,OAAO,SAAS,EAAE;AAElF,SAAO,kBAAkB,oCAAuB,OAAO,QAAQ;AAC7D,UAAM,EAAE,MAAM,WAAW,KAAK,IAAI,IAAI;AACtC,UAAM,IAAK,QAAQ,CAAC;AAEpB,QAAI;AACF,cAAQ,MAAM;AAAA,QACZ,KAAK,gBAAgB;AACnB,gBAAM,OAAO,MAAM,YAAY,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC9D,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,iBAAiB;AACpB,gBAAM,OAAO,MAAM,aAAa,WAAW,EAAE,QAAQ,EAAE,QAAQ,WAAW,EAAE,UAAU,CAAC;AACvF,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,aAAa;AAChB,gBAAM,OAAO,MAAM,SAAS,WAAW,CAAC;AACxC,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,mBAAmB;AACtB,gBAAM,OAAO,MAAM,cAAc,WAAW,CAAQ;AACpD,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,aAAa;AAChB,gBAAM,OAAO,MAAM,SAAS,WAAW,EAAE,SAAS,EAAE,SAAS,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,CAAC;AAC/G,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,WAAW;AACd,gBAAM,SAAS,EAAE,WAAW,WAAW,WAAW;AAClD,gBAAM,OAAO,MAAM,QAAQ,WAAW,EAAE,QAAQ,YAAY,EAAE,YAAY,WAAW,EAAE,UAAU,CAAC;AAClG,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,cAAc;AACjB,gBAAM,SAAS,MAAM,WAAW,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;AACvE,cAAI,OAAO,SAAS,SAAS;AAC3B,mBAAO;AAAA,cACL,SAAS,CAAC,EAAE,MAAM,SAAS,MAAM,OAAO,MAAM,UAAU,OAAO,SAAS,CAAC;AAAA,YAC3E;AAAA,UACF;AACA,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,EAAE;AAAA,QAC1D;AAAA,QACA,KAAK,cAAc;AACjB,gBAAM,OAAO,MAAM,UAAU,WAAW,EAAE,WAAW,EAAE,WAAW,cAAc,EAAE,cAAc,WAAW,EAAE,WAAW,QAAQ,EAAE,OAAO,CAAC;AAC1I,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,WAAW;AACd,gBAAM,OAAO,MAAM,OAAO,WAAW,EAAE,WAAW,EAAE,WAAW,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,WAAW,EAAE,WAAW,QAAQ,EAAE,OAAO,CAAC;AACvK,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,YAAY;AACf,gBAAM,OAAO,MAAM,QAAQ,WAAW,EAAE,WAAW,EAAE,WAAW,MAAM,EAAE,MAAM,WAAW,EAAE,WAAW,QAAQ,EAAE,QAAQ,WAAW,EAAE,WAAW,QAAQ,EAAE,OAAO,CAAC;AAClK,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,OAAO,MAAM,cAAc,WAAW,EAAE,WAAW,EAAE,WAAW,SAAS,EAAE,SAAS,mBAAmB,EAAE,mBAAmB,WAAW,EAAE,UAAU,CAAC;AAC1J,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,YAAY;AACf,gBAAM,OAAO,MAAM,QAAQ,WAAW,EAAE,WAAW,EAAE,WAAW,QAAQ,EAAE,QAAQ,QAAQ,EAAE,QAAQ,WAAW,EAAE,UAAU,CAAC;AAC5H,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,OAAO,MAAM,cAAc,WAAW;AAAA,YAC1C,MAAM,EAAE;AAAA,YACR,WAAW,EAAE;AAAA,YACb,OAAO,EAAE;AAAA,YACT,WAAW,EAAE;AAAA,UACf,CAAC;AACD,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,gBAAgB;AACnB,gBAAM,OAAO,MAAM,YAAY,WAAW;AAAA,YACxC,YAAY,EAAE;AAAA,YACd,WAAW,EAAE;AAAA,YACb,MAAM,EAAE;AAAA,UACV,CAAC;AACD,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA,KAAK,iBAAiB;AACpB,gBAAM,OAAO,MAAM,aAAa,WAAW,EAAE,WAAW,EAAE,WAAW,QAAQ,EAAE,OAAO,CAAC;AACvF,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,QAC7C;AAAA,QACA;AACE,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,iBAAiB,IAAI,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MACvF;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,KAAK,WAAW,OAAO,GAAG,CAAC,GAAG,CAAC;AAAA,QACzE,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,IAAI,kCAAqB;AAChD,QAAM,OAAO,QAAQ,cAAc;AACnC,UAAQ,OAAO,MAAM,kCAAkC,KAAK,IAAI;AAAA,CAAU;AAC5E;;;AP/YO,SAAS,UAAU,MAAgB,MAAyB,QAAQ,KAOzE;AACA,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,SAAK,QAAQ,eAAe,QAAQ,SAAS,KAAK,IAAI,CAAC,GAAG;AACxD,eAAS,KAAK,EAAE,CAAC;AAAA,IACnB,WAAW,KAAK,WAAW,YAAY,GAAG;AACxC,eAAS,IAAI,MAAM,aAAa,MAAM;AAAA,IACxC,WAAW,QAAQ,gBAAgB,KAAK,IAAI,CAAC,GAAG;AAC9C,gBAAU,KAAK,EAAE,CAAC;AAAA,IACpB,WAAW,QAAQ,YAAY,KAAK,IAAI,CAAC,GAAG;AAC1C,YAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK;AACrC,UAAI,UAAU,WAAW,UAAU,WAAW,UAAU,MAAO,gBAAe;AAAA,IAChF,WAAW,KAAK,WAAW,SAAS,GAAG;AACrC,YAAM,QAAQ,IAAI,MAAM,UAAU,MAAM,EAAE,KAAK;AAC/C,UAAI,UAAU,WAAW,UAAU,WAAW,UAAU,MAAO,gBAAe;AAAA,IAChF,WAAW,QAAQ,YAAY,KAAK,IAAI,CAAC,GAAG;AAC1C,aAAO,OAAO,KAAK,EAAE,CAAC,CAAC;AAAA,IACzB,WAAW,KAAK,WAAW,SAAS,GAAG;AACrC,aAAO,OAAO,IAAI,MAAM,UAAU,MAAM,CAAC;AAAA,IAC3C,WAAW,QAAQ,gBAAgB,KAAK,IAAI,CAAC,GAAG;AAC9C,iBAAW,KAAK,EAAE,CAAC;AAAA,IACrB,YAAY,QAAQ,iBAAiB,QAAQ,aAAa,KAAK,IAAI,CAAC,GAAG;AACrE,eAAS,KAAK,EAAE,CAAC;AAAA,IACnB,WAAW,KAAK,WAAW,cAAc,GAAG;AAC1C,eAAS,IAAI,MAAM,eAAe,MAAM;AAAA,IAC1C,WAAW,QAAQ,YAAY,QAAQ,MAAM;AAC3C,gBAAU;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,CAAC,UAAU,IAAI,eAAgB,UAAS,IAAI;AAChD,MAAI,CAAC,YAAY,IAAI,gBAAiB,YAAW,IAAI;AACrD,MAAI,CAAC,UAAU,IAAI,eAAgB,UAAS,IAAI;AAChD,MAAI,CAAC,gBAAgB,IAAI,sBAAsB;AAC7C,UAAM,QAAQ,IAAI,qBAAqB,KAAK;AAC5C,QAAI,UAAU,WAAW,UAAU,WAAW,UAAU,MAAO,gBAAe;AAAA,EAChF;AAEA,QAAM,OAAO,iBAAiB,SAAS,UAAW,UAAU,IAAI,qBAAqB,QAAQ;AAC7F,SAAO,EAAE,MAAM,MAAM,UAAU,QAAQ,SAAS,OAAO;AACzD;AAEA,SAAS,YAAkB;AACzB,UAAQ,MAAM,iBAAiB,CAAC;AAClC;AAEA,eAAe,UAAU,QAAQ,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ;AACrD,UAAQ,OAAO,MAAM,uBAAuB,KAAK,WAAW,GAAG;AAAA,CAAI;AACnE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["slice","result","result","annotated","lines","result","result","result","id","result","os","server","stdioTransport"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/tools/mesh-tools.ts","../src/transports/ipc.ts","../src/transports/mode.ts","../src/tools/chat-compact.ts","../src/tools/read-chat-polling-advisory.ts","../src/help.ts","../src/server.ts","../src/transports/local.ts","../src/transports/cloud.ts","../src/tools/list-sessions.ts","../src/tools/list-daemons.ts","../src/tools/read-chat.ts","../src/tools/read-chat-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 --api-key adk_xxx # cloud mode\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' | 'cloud' | 'ipc';\n port?: number;\n password?: string;\n apiKey?: string;\n baseUrl?: string;\n meshId?: string;\n} {\n const args = argv.slice(2);\n let apiKey: string | undefined;\n let baseUrl: string | undefined;\n let port: number | undefined;\n let password: string | undefined;\n let meshId: string | undefined;\n let explicitMode: 'local' | 'cloud' | 'ipc' | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if ((arg === '--api-key' || arg === '-k') && args[i + 1]) {\n apiKey = args[++i];\n } else if (arg?.startsWith('--api-key=')) {\n apiKey = arg.slice('--api-key='.length);\n } else if (arg === '--base-url' && args[i + 1]) {\n baseUrl = args[++i];\n } else if (arg === '--mode' && args[i + 1]) {\n const value = String(args[++i]).trim();\n if (value === 'local' || value === 'cloud' || value === 'ipc') explicitMode = value;\n } else if (arg?.startsWith('--mode=')) {\n const value = arg.slice('--mode='.length).trim();\n if (value === 'local' || value === 'cloud' || 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 (!apiKey && env.ADHDEV_API_KEY) apiKey = env.ADHDEV_API_KEY;\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 === 'cloud' || value === 'ipc') explicitMode = value;\n }\n\n const mode = explicitMode || (apiKey ? 'cloud' : (meshId && env.ADHDEV_INLINE_MESH ? 'ipc' : 'local'));\n return { mode, port, password, apiKey, baseUrl, 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 * 24 tools: mesh_status, 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 */\n\nimport { randomUUID } from 'node:crypto';\nimport { CloudTransport } from '../transports/cloud.js';\nimport { IpcTransport } from '../transports/ipc.js';\nimport { isLocalTransport } from '../transports/mode.js';\nimport type { McpTransport } from '../transports/mode.js';\nimport { compactChatPayload } 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 buildMeshActiveWork,\n buildMeshLedgerReconciliationEvidence,\n buildMeshLedgerReplicaEvidence,\n buildP2pRelayFailurePayload,\n cancelTask,\n classifyP2pRelayFailure,\n drainPendingMeshCoordinatorEvents,\n enqueueTask,\n getQueue,\n getLedgerSummary,\n getSessionRecoveryContext,\n isP2pRelayTransportFailure,\n readLedgerEntries,\n readLedgerSlice,\n requeueTask,\n validateMeshTaskModeRequest,\n} from '@adhdev/daemon-core';\n\nexport interface MeshContext {\n mesh: LocalMeshEntry;\n transport: McpTransport;\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 meshSessionProviderMetadata = new Map<string, MeshSessionProviderMetadata>();\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. After a terminal signal, call mesh_read_chat once with compact=true, then verify git state if repository changes were expected.',\n message: 'Do not repeatedly poll mesh_status/mesh_view_queue/mesh_read_chat while delegated work is generating; these snapshots rarely change until the worker emits a completion/status event.',\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 },\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 };\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 if (!(ctx.transport instanceof IpcTransport)) return;\n try {\n const result = await (ctx.transport as IpcTransport).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 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\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 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 coordinatorDaemonId = typeof settings?.meshCoordinatorDaemonId === 'string' ? settings.meshCoordinatorDaemonId.trim() : '';\n const sessionNodeId = typeof settings?.meshNodeId === 'string' ? settings.meshNodeId.trim() : '';\n if (sessionMeshId !== meshId || !coordinatorDaemonId) return false;\n return !sessionNodeId || sessionNodeId === nodeId;\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 isMeshOwnedDelegateSession(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 ...(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.`,\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\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 },\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.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 (!isMeshOwnedDelegateSession(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 });\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\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 directLocal = isLocalControlPlaneNode(ctx, node);\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 const locality = sameMachine ? 'same_machine' : (evidence.length > 0 ? 'remote_known' : 'remote_or_unknown');\n const localityReason = sameMachine\n ? (directLocal ? 'matched coordinator daemon or machine id' : '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 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 );\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 if (isDirectLocalNode(ctx, node)) return true;\n\n // Worktree nodes created by the local daemon may be persisted without their\n // own machineId. In that case, preserve locality from the cloned source node\n // rather than incorrectly routing local workspace commands through P2P.\n if (node.isLocalWorktree === true) {\n const sourceNode = findClonedFromNode(ctx, node);\n if (sourceNode && isDirectLocalNode(ctx, sourceNode)) return true;\n }\n\n return false;\n}\n\nfunction meshSessionCacheKey(nodeId: string, runtimeSessionId: string): string {\n return `${nodeId}:${runtimeSessionId}`;\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 return countUncommittedChanges(status) > 0;\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 = !isLocalTransport(ctx.transport) && node.daemonId\n ? await (ctx.transport as CloudTransport).gitStatus(node.daemonId, repo.workspace, false, true)\n : 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 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\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\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\nfunction summarizeBranchConvergence(nodes: any[]): Record<string, unknown> {\n const followUps = nodes\n .filter(node => node?.branchConvergence?.needsConvergence === true)\n .map(node => ({\n nodeId: node.nodeId,\n workspace: node.workspace,\n branch: node.branchConvergence.branch,\n status: node.branchConvergence.status,\n reason: node.branchConvergence.reason,\n nextStep: node.branchConvergence.nextStep,\n }));\n\n return {\n needsFollowUp: followUps.length > 0,\n unresolvedCount: followUps.length,\n requiredFinalStates: ['merged_to_main', 'pushed_feature_branch_needs_merge', 'blocked_review', 'cleanup_candidate', 'not_mergeable'],\n followUps,\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 if (isLocalTransport(ctx.transport)) {\n return ctx.transport.command(command, args);\n }\n const identity = buildNodeMachineIdentity(ctx, node);\n throw new Error(`Command '${command}' requires daemon IPC/local transport for node '${node.id}' (hostname=${identity.hostname || 'unknown'}, coordinatorHostname=${identity.coordinatorHostname || 'unknown'}, sameMachine=${identity.sameMachine})`);\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\n try {\n surfacedEvents.push(\n ...normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', { meshId: ctx.mesh.id }) as any)\n .filter(matchesCurrentMesh),\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', { meshId: ctx.mesh.id }),\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 }\n } catch {\n // Non-fatal: remote pending-event recovery is best-effort.\n }\n }\n\n try {\n surfacedEvents.push(\n ...normalizePendingMeshCoordinatorEvents(await ctx.transport.command('get_pending_mesh_events', { meshId: ctx.mesh.id }) as any)\n .filter(matchesCurrentMesh),\n );\n } catch {\n // Non-fatal: pending events are best-effort.\n }\n\n return surfacedEvents;\n }\n\n if (isLocalTransport(ctx.transport)) {\n return (drainPendingMeshCoordinatorEvents(ctx.mesh.id) as any[]).filter(matchesCurrentMesh);\n }\n\n return [];\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. 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 },\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 },\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 },\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.',\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 },\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 },\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. Defaults to dry-run; execution requires execute=true. Never pushes, rebases, resets, cleans, or checks out arbitrary revisions.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\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 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: 'When true, if the root fast-forward changes gitlinks, run only git submodule update --init --recursive and verify submodules clean.' },\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_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).' },\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 },\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_REFINE_NODE_TOOL = {\n name: 'mesh_refine_node',\n description: 'The Refinery: Accept an async validation/merge/cleanup job for a completed worktree node. 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 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 },\n required: ['node_id'],\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 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_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_TASK_HISTORY_TOOL,\n MESH_RECONCILE_LEDGER_TOOL,\n];\n\n// ─── Tool Implementations ───────────────────────\n\nexport async function meshStatus(ctx: MeshContext): Promise<string> {\n await refreshMeshFromDaemon(ctx);\n const { mesh, transport } = ctx;\n const results: any[] = [];\n\n const ledgerSummary = getLedgerSummary(mesh.id);\n\n for (const node of mesh.nodes) {\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 if (!isLocalTransport(transport) && node.daemonId) {\n const result = await (transport as CloudTransport).gitStatus(node.daemonId, node.workspace, false, true);\n const status = extractGitStatus(result);\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 // Submodule out-of-sync warning\n const submodules = extractSubmodules(result, (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 } else if (isLocalTransport(transport)) {\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 // 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 } else {\n entry.health = 'unknown';\n entry.note = 'No daemonId available for cloud status probe';\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: 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 liveSessions = await collectLiveStatusSessions(ctx, node);\n if (liveSessions.length > 0) {\n entry.sessions = liveSessions;\n }\n\n results.push(entry);\n }\n\n const activeWorkEvidence = buildMeshActiveWork({\n meshId: mesh.id,\n queue: getQueue(mesh.id),\n ledgerEntries: readLedgerEntries(mesh.id, { tail: 500 }),\n nodes: results,\n });\n\n const pollingGuidance = buildActiveWorkPollingGuidance(activeWorkEvidence.summary);\n const response: Record<string, unknown> = {\n meshId: mesh.id,\n meshName: mesh.name,\n repoIdentity: mesh.repoIdentity,\n policy: mesh.policy,\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: results,\n activeWork: activeWorkEvidence.activeWork,\n staleDirectWork: activeWorkEvidence.staleDirectWork,\n terminalDirectWork: activeWorkEvidence.terminalDirectWork,\n activeWorkSummary: activeWorkEvidence.summary,\n ...(pollingGuidance ? { pollingGuidance } : {}),\n branchConvergenceSummary: summarizeBranchConvergence(results),\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 try {\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\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 },\n): Promise<string> {\n const { mesh } = ctx;\n const pendingEvents = await drainCoordinatorPendingEvents(ctx);\n const tail = typeof args.tail === 'number' && args.tail > 0 ? args.tail : 20;\n const kind = typeof args.kind === 'string' && args.kind.trim() ? [args.kind.trim() as any] : undefined;\n const entries = readLedgerEntries(mesh.id, { tail, kind });\n const summary = getLedgerSummary(mesh.id);\n return JSON.stringify({\n meshId: mesh.id,\n entries,\n summary,\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 const slice = readLedgerSlice(ctx.mesh.id, queryArgs);\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'local',\n slice,\n status: 'local',\n }));\n continue;\n }\n\n const result = await commandForNode(ctx, node, 'get_mesh_ledger_slice', queryArgs);\n const payload = unwrapCommandPayload(result);\n if (payload?.success === false) {\n throw new Error(payload.error || 'remote get_mesh_ledger_slice failed');\n }\n const slice = payload?.slice ?? payload;\n if (slice?.protocol !== 'adhdev.mesh.ledger.slice.v1' || !Array.isArray(slice.entries)) {\n throw new Error('remote daemon returned an invalid ledger slice payload');\n }\n const importResult = shouldImport\n ? appendRemoteLedgerEntries(ctx.mesh.id, slice.entries)\n : { accepted: 0, skippedDuplicate: 0, rejectedInvalid: 0, entries: [] };\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: 'p2p_datachannel',\n slice,\n importResult,\n }));\n if (shouldImport && importResult.accepted > 0) {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_replicated',\n nodeId: node.id,\n payload: {\n protocol: 'adhdev.mesh.ledger.slice.v1',\n imported: importResult.accepted,\n skippedDuplicate: importResult.skippedDuplicate,\n rejectedInvalid: importResult.rejectedInvalid,\n nextAfterId: slice.cursor?.nextAfterId ?? null,\n via: 'p2p_datachannel',\n },\n });\n }\n } catch (e: any) {\n replicas.push(buildMeshLedgerReplicaEvidence({\n nodeId: node.id,\n daemonId: node.daemonId,\n transport: node.daemonId ? 'p2p_datachannel' : 'local',\n status: 'failed',\n error: e?.message ?? String(e),\n }));\n }\n }\n\n const evidence = buildMeshLedgerReconciliationEvidence(ctx.mesh.id, replicas);\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'ledger_reconciled',\n payload: {\n protocol: evidence.protocol,\n sourceOfTruth: evidence.sourceOfTruth,\n totals: evidence.totals,\n convergence: evidence.convergence,\n },\n });\n return JSON.stringify({ success: true, evidence }, null, 2);\n}\n\nexport async function 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 meshEnqueueTask(\n ctx: MeshContext,\n args: { message: string; task_mode?: string; taskMode?: string },\n): Promise<string> {\n const taskMode = readString(args.task_mode) || readString(args.taskMode);\n try {\n const task = enqueueTask(ctx.mesh.id, args.message, { taskMode });\n\n // ── LocalTransport: queue-based pull (standalone daemon, all local) ─────\n if (isLocalTransport(ctx.transport) && !(ctx.transport instanceof IpcTransport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n return JSON.stringify({ success: true, source: 'queue', taskId: task.id, status: task.status, taskMode: task.taskMode });\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 if (ctx.transport instanceof IpcTransport) {\n // 1. Trigger local queue for local node pick-up\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\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\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(() => { /* non-fatal: no idle session or P2P failure */ }),\n );\n }\n // Fire-and-forget — don't block the coordinator response\n Promise.all(dispatchPromises).catch(() => {});\n\n return JSON.stringify({ success: true, source: 'queue', taskId: task.id, status: task.status, taskMode: task.taskMode });\n }\n\n // ── CloudTransport fallback ───────────────────────────────────────────────\n return JSON.stringify({ success: true, source: 'queue', taskId: task.id, status: task.status, taskMode: task.taskMode });\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 return JSON.stringify({ success: false, error: message });\n }\n}\n\nexport async function meshViewQueue(\n ctx: MeshContext,\n args: { status?: string[]; view?: QueueViewMode },\n): Promise<string> {\n try {\n await refreshMeshFromDaemon(ctx);\n const statusFilter = sanitizeQueueStatusFilter(args.status);\n const view = normalizeQueueViewMode(args.view);\n const fullQueue = prioritizeActiveQueueRows(annotateQueueStaleness(getQueue(ctx.mesh.id), 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 activeWorkEvidence = buildMeshActiveWork({\n meshId: ctx.mesh.id,\n queue: fullQueue,\n ledgerEntries: readLedgerEntries(ctx.mesh.id, { tail: 500 }),\n nodes: ctx.mesh.nodes,\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 return JSON.stringify({\n success: true,\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,\n visibleQueue: queue,\n activeWork: activeWorkEvidence.activeWork,\n staleDirectWork: activeWorkEvidence.staleDirectWork,\n activeWorkSummary: activeWorkEvidence.summary,\n ...(pollingGuidance ? { pollingGuidance } : {}),\n visibleSummary,\n summary,\n activeCounts: (summary as any).activeCounts,\n historicalCounts: (summary as any).historicalCounts,\n activeCount: (summary as any).activeCount,\n historicalCount: (summary as any).historicalCount,\n visibleActiveCounts: (visibleSummary as any).activeCounts,\n visibleHistoricalCounts: (visibleSummary as any).historicalCounts,\n visibleActiveCount: (visibleSummary as any).activeCount,\n visibleHistoricalCount: (visibleSummary as any).historicalCount,\n staleAssignedTasks,\n staleAssignedCount: (maintenance as any).staleAssignedCount,\n queueMaintenance: maintenance,\n cleanupDryRun: maintenance,\n ...(view === 'active' || statusFilter?.some(status => ACTIVE_QUEUE_STATUSES.has(status)) ? {\n activeQueue: queue.filter((task: any) => ACTIVE_QUEUE_STATUSES.has(String(task?.status || ''))),\n } : {}),\n ...(view === 'historical' || requestedHistoricalRows ? {\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: 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 if (isLocalTransport(ctx.transport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\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 },\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 });\n if (!task) return JSON.stringify({ success: false, error: `Queue task '${taskId}' not found` });\n if (isLocalTransport(ctx.transport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\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: { node_id: string; session_id?: string; message: string; task_mode?: string; taskMode?: string },\n): Promise<string> {\n const requestedTaskMode = readString(args.task_mode) || readString(args.taskMode);\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 // 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 // ── CloudTransport: delegate to Cloud API ──────────────────────────────\n if (!isLocalTransport(ctx.transport) && node.daemonId) {\n const res = await (ctx.transport as CloudTransport).meshEnqueueTask(node.daemonId, {\n meshId: ctx.mesh.id,\n message: args.message,\n targetNodeId: args.node_id,\n ...(taskMode ? { taskMode } : {}),\n });\n return JSON.stringify(res);\n }\n\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 = meshSessionProviderMetadata.get(meshSessionCacheKey(args.node_id, args.session_id || ''));\n const taskId = randomUUID();\n const result = await ipcDispatchToRemoteAgent(ctx, node, {\n session_id: args.session_id,\n message: args.message,\n providerType: cached?.providerType,\n });\n if (result.success) {\n // Record dispatch in ledger so task_history is accurate\n const dispatchedSessionId = args.session_id || result.sessionId;\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 } 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 && isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(meshSessionCacheKey(args.node_id, args.session_id));\n let resolvedProviderType = cached?.providerType || '';\n if (!resolvedProviderType) {\n const statusResult = await commandForNode(ctx, node, 'get_status_metadata', {});\n const sessions = extractStatusMetadataSessions(statusResult);\n const explicitSession = sessions.find(session => readSessionRecordId(session) === args.session_id);\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 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 });\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 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 });\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 const taskId = randomUUID();\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 }),\n });\n } catch { /* best-effort */ }\n return JSON.stringify({ success: true, dispatched: true, source: 'direct', taskId, taskMode, providerType: resolvedProviderType, nodeId: args.node_id, sessionId: args.session_id });\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 });\n\n if (isLocalTransport(ctx.transport) || ctx.transport instanceof IpcTransport) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\n\n // Also drain any pending coordinator events so the caller sees them inline\n const pendingEvents = isLocalTransport(ctx.transport)\n ? drainPendingMeshCoordinatorEvents(ctx.mesh.id)\n : [];\n\n const result: Record<string, unknown> = { success: true, source: 'queue', nodeId: args.node_id, taskId: task.id, status: task.status, taskMode: task.taskMode };\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 if (ctx.transport instanceof IpcTransport || isLocalTransport(ctx.transport)) {\n await drainCoordinatorPendingEvents(ctx, { nodeIds: [args.node_id] });\n }\n\n if (isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(meshSessionCacheKey(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 if (args.compact) {\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const targetId = `${node.daemonId}:session:${args.session_id}`;\n const res = await (ctx.transport as CloudTransport).readChat(targetId, {\n limit: args.tail ?? 10,\n sessionId: args.session_id,\n });\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh read_chat requires node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(meshSessionCacheKey(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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const targetId = `${node.daemonId}:session:${args.session_id}`;\n const res = await (ctx.transport as CloudTransport).getChatDebugBundle(targetId, {\n sessionId: args.session_id,\n tailLimit: args.tail ?? 40,\n delivery: args.delivery,\n });\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n }\n\n return JSON.stringify({ error: 'Cloud mesh read_debug requires node daemonId' });\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\n if (isLocalTransport(ctx.transport)) {\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 = coordinatorNode?.daemonId || ctx.localDaemonId;\n const spawnedSessionVisibility = readSpawnedSessionVisibility(ctx.mesh.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 meshNodeFor: ctx.mesh.id,\n meshNodeId: args.node_id,\n spawnedSessionVisibility,\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 });\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 if (ctx.transport instanceof IpcTransport && node.daemonId && !isLocalNode) {\n ctx.transport.meshCommand(node.daemonId, 'trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n } else if (isLocalTransport(ctx.transport)) {\n ctx.transport.command('trigger_mesh_queue', { meshId: ctx.mesh.id }).catch(() => {});\n }\n\n return JSON.stringify({\n ...launchPayload,\n resolvedProviderType,\n ...(providerSessionId ? { providerSessionId } : {}),\n }, null, 2);\n } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\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 resolvedProviderType = providerPriority[0]; // Best effort for cloud, skip detection\n }\n\n const coordinatorNode = resolveCoordinatorNode(ctx);\n const coordinatorDaemonId = coordinatorNode?.daemonId || ctx.localDaemonId;\n const spawnedSessionVisibility = readSpawnedSessionVisibility(ctx.mesh.policy);\n if (!coordinatorDaemonId) {\n return JSON.stringify(buildMissingCoordinatorDaemonIdFailure(ctx, node, resolvedProviderType), null, 2);\n }\n\n try {\n const res = await (ctx.transport as CloudTransport).launch(node.daemonId, {\n type: resolvedProviderType,\n dir: node.workspace,\n settings: {\n meshNodeFor: ctx.mesh.id,\n meshNodeId: args.node_id,\n spawnedSessionVisibility,\n ...(coordinatorDaemonId ? { meshCoordinatorDaemonId: coordinatorDaemonId } : {}),\n ...(coordinatorNode?.id ? { meshCoordinatorNodeId: coordinatorNode.id } : {}),\n launchedByCoordinator: true\n }\n });\n\n const runtimeSessionId = typeof res?.sessionId === 'string' ? res.sessionId : typeof res?.id === 'string' ? res.id : '';\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: {},\n });\n } catch { /* best-effort */ }\n\n return JSON.stringify({ ...res, resolvedProviderType }, null, 2);\n } catch (e: any) {\n return JSON.stringify(recordRecoverableLaunchFailure(ctx, node, resolvedProviderType, e), null, 2);\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh launch_session requires node daemonId' });\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 if (!isLocalTransport(ctx.transport) && node.daemonId) {\n const result = await (ctx.transport as CloudTransport).gitStatus(node.daemonId, node.workspace, true, true);\n return JSON.stringify({\n nodeId: args.node_id,\n workspace: node.workspace,\n status: extractGitStatus(result),\n diff: extractGitDiff(result),\n submodules: autoDiscoverSubmodules ? extractSubmodules(result, submoduleIgnorePaths) : undefined,\n relatedRepos: await collectRelatedRepoStatuses(ctx, node),\n }, null, 2);\n } else if (isLocalTransport(ctx.transport)) {\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 } else {\n return JSON.stringify({ error: 'No daemonId available for cloud git_status probe' });\n }\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; branch?: string; execute?: boolean; dry_run?: boolean; update_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 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 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 if (isLocalTransport(ctx.transport)) {\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: { message: args.message, commit: (result as any)?.checkpoint?.commit },\n });\n } catch { /* ledger append is best-effort */ }\n\n return JSON.stringify(result, null, 2);\n } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).gitCheckpoint(node.daemonId, {\n workspace: node.workspace,\n message: args.message,\n includeUntracked: true,\n });\n try {\n appendLedgerEntry(ctx.mesh.id, {\n kind: 'checkpoint_created',\n nodeId: args.node_id,\n payload: { message: args.message, commit: (res as any)?.checkpoint?.commit },\n });\n } catch { /* best-effort */ }\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh checkpoint requires node daemonId' });\n }\n}\n\nexport async function meshApprove(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; action: string },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id); // membership check\n\n if (isLocalTransport(ctx.transport)) {\n const cached = meshSessionProviderMetadata.get(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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const targetId = `${node.daemonId}:session:${args.session_id}`;\n const res = await (ctx.transport as CloudTransport).approve(targetId, args.action === 'reject' ? 'reject' : 'approve');\n return JSON.stringify(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh approve requires node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\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 } else if (!isLocalTransport(ctx.transport) && sourceNode.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshCloneNode(sourceNode.daemonId, {\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(res);\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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh clone_node requires source node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshCleanupSessions(node.daemonId, {\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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh cleanup_sessions requires node daemonId' });\n }\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 if (isLocalTransport(ctx.transport)) {\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshRemoveNode(node.daemonId, {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n ...(args.session_cleanup_mode ? { sessionCleanupMode: args.session_cleanup_mode } : {}),\n inlineMesh: ctx.mesh,\n });\n if (res?.success && res.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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh remove_node requires node daemonId' });\n }\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 },\n): Promise<string> {\n const node = await findNodeWithRefresh(ctx, args.node_id);\n\n if (isLocalTransport(ctx.transport)) {\n const result = await commandForNode(ctx, node, 'refine_mesh_node', {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\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 } else if (!isLocalTransport(ctx.transport) && node.daemonId) {\n try {\n const res = await (ctx.transport as CloudTransport).meshRefineNode(node.daemonId, {\n meshId: ctx.mesh.id,\n nodeId: args.node_id,\n inlineMesh: ctx.mesh,\n });\n if (res?.success && res.async !== true && res.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(res, null, 2);\n } catch (e: any) {\n return JSON.stringify({ success: false, error: e.message });\n }\n } else {\n return JSON.stringify({ error: 'Cloud mesh refine_node requires node daemonId' });\n }\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\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\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 async sendIpcCommand(type: string, args: Record<string, unknown>): Promise<any> {\n const WebSocketCtor = globalThis.WebSocket;\n if (!WebSocketCtor) {\n throw new Error('WebSocket is not available in this Node runtime; Node 20+ is required for daemon IPC mode');\n }\n\n return new Promise((resolve, reject) => {\n const requestId = `mcp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n const ws = new WebSocketCtor(`ws://127.0.0.1:${this.port}${this.path}`);\n let settled = false;\n\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n try { ws.close(); } catch { /* noop */ }\n fn();\n };\n\n const nestedCommand = typeof args?.command === 'string' ? args.command : '';\n const targetDaemonId = typeof args?.targetDaemonId === 'string' ? args.targetDaemonId : '';\n const effectiveType = type === 'mesh_relay_command' && nestedCommand ? nestedCommand : type;\n const timeoutMs = Math.max(\n IPC_COMMAND_TIMEOUTS_MS[type] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\n IPC_COMMAND_TIMEOUTS_MS[effectiveType] ?? DEFAULT_IPC_COMMAND_TIMEOUT_MS,\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 const timeout = setTimeout(() => {\n finish(() => reject(new Error(`Daemon IPC ${diagnosticParts.join(' ')} timed out after ${Math.round(timeoutMs / 1000)}s (requestId=${requestId})`)));\n }, timeoutMs);\n\n let commandSent = false;\n const send = () => {\n if (commandSent) return;\n commandSent = true;\n ws.send(JSON.stringify({\n type: 'ext:command',\n payload: { command: type, args, requestId },\n }));\n };\n\n ws.addEventListener('open', () => {\n 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 ws.addEventListener('message', (event) => {\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 send();\n return;\n }\n if (msg?.type !== 'ext:command_result') return;\n if (msg?.payload?.requestId !== requestId) return;\n const payload = msg.payload;\n if (payload?.success === false) {\n finish(() => reject(new Error(payload.error || `Daemon IPC command '${type}' failed`)));\n return;\n }\n finish(() => resolve(payload?.result ?? payload));\n } catch {\n // Ignore non-JSON or unrelated daemon messages.\n }\n });\n\n ws.addEventListener('error', () => {\n finish(() => reject(new Error(`Cannot connect to daemon IPC at ws://127.0.0.1:${this.port}${this.path}`)));\n });\n });\n }\n}\n","import type { LocalTransport } from './local.js';\nimport type { CloudTransport } from './cloud.js';\nimport type { IpcTransport } from './ipc.js';\n\nexport type CommandTransport = LocalTransport | IpcTransport;\nexport type McpTransport = CommandTransport | CloudTransport;\n\n/**\n * Local/IPC and cloud transports are intentionally detected by an operation that\n * is unique to command-routed daemon modes. CloudTransport also exposes methods\n * like getStatus(targetId), so checking for getStatus incorrectly routes cloud\n * tools through command mode.\n */\nexport function isLocalTransport(\n transport: McpTransport,\n): transport is CommandTransport {\n return typeof (transport as { command?: unknown }).command === 'function';\n}\n","export type CompactChatMessage = Record<string, any>;\n\nfunction isAssistantLike(message: any): boolean {\n const role = String(message?.role ?? '').toLowerCase();\n return role === 'assistant' || role === 'agent';\n}\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\nexport function buildCompactMessageTail(\n visibleMessages: CompactChatMessage[],\n opts: { summary?: string; finalAssistant?: CompactChatMessage | undefined; limit: number },\n): CompactChatMessage[] {\n const summary = typeof opts.summary === 'string' ? opts.summary.trim() : '';\n const shouldOmitSummaryMessage = !!summary\n && !!opts.finalAssistant\n && isAssistantLike(opts.finalAssistant)\n && messageContent(opts.finalAssistant).trim() === summary;\n const sourceMessages = shouldOmitSummaryMessage\n ? visibleMessages.filter((message) => message !== opts.finalAssistant)\n : visibleMessages;\n return sourceMessages.slice(-opts.limit);\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 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: visible.length,\n omittedMessages: Math.max(0, rawMessages.length - visible.length),\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 --api-key <key> Cloud mode (ADHDev cloud API)\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, cloud, or ipc\n --port <n> Standalone or IPC daemon port (defaults: local 3847, ipc 19222)\n --password <pass> Standalone daemon password (if set)\n --api-key <key> ADHDev cloud API key (switches to cloud mode)\n --base-url <url> Override cloud API base URL\n --repo-mesh <mesh_id> Enable mesh mode — exposes only mesh-scoped coordinator tools\n --help Show this help\n\nEnvironment variables:\n ADHDEV_API_KEY API key (cloud mode)\n ADHDEV_PASSWORD Daemon password (local mode)\n ADHDEV_MESH_ID Mesh ID (mesh mode)\n ADHDEV_MCP_TRANSPORT Transport: local, cloud, 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 * Three modes:\n * local — talks to standalone daemon at localhost:3847\n * cloud — talks to ADHDev cloud API with an API key\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 { CloudTransport } from './transports/cloud.js';\nimport { IpcTransport } from './transports/ipc.js';\nimport type { McpTransport } 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 { 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,\n meshCleanupSessions, meshTaskHistory, meshReconcileLedger\n} from './tools/mesh-tools.js';\nimport type { MeshContext } from './tools/mesh-tools.js';\n\nexport interface AdhdevMcpServerOptions {\n mode: 'local' | 'cloud' | 'ipc';\n // local options\n port?: number;\n password?: string;\n // cloud options\n apiKey?: string;\n baseUrl?: 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: McpTransport =\n opts.mode === 'cloud'\n ? new CloudTransport({ apiKey: opts.apiKey!, baseUrl: opts.baseUrl })\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 : opts.mode === 'ipc'\n ? `Make sure the cloud daemon is running with local IPC enabled (adhdev daemon).`\n : `Check your API key and network connectivity.`;\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: Cloud API (when running with --api-key)\n if (!mesh && opts.mode === 'cloud' && opts.apiKey) {\n try {\n const base = opts.baseUrl || 'https://api.adhf.dev';\n const res = await fetch(`${base}/api/v1/repo-meshes/${opts.meshId}`, {\n headers: { 'Authorization': `Bearer ${opts.apiKey}`, 'Content-Type': 'application/json' },\n });\n if (res.ok) {\n const data = await res.json() as any;\n const rm = data.mesh;\n const nodes = data.nodes || [];\n // Convert cloud D1 record → LocalMeshEntry shape for mesh tools\n let policy: any = {};\n try { policy = JSON.parse(rm.policy_json || rm.policy || '{}'); } catch { /* */ }\n let coordinator: any = {};\n try { coordinator = JSON.parse(rm.coordinator_json || rm.coordinator_config || '{}'); } catch { /* */ }\n mesh = {\n id: rm.id,\n name: rm.name,\n repoIdentity: rm.repo_identity,\n repoRemoteUrl: rm.repo_remote_url,\n defaultBranch: rm.default_branch,\n policy: {\n requirePreTaskCheckpoint: false,\n requirePostTaskCheckpoint: true,\n requireApprovalForPush: true,\n allowAutoPublishSubmoduleMainCommits: false,\n requireApprovalForDestructiveGit: true,\n dirtyWorkspaceBehavior: 'warn',\n maxParallelTasks: 2,\n spawnedSessionVisibility: 'visible',\n ...policy,\n },\n coordinator,\n nodes: nodes.map((n: any) => ({\n id: n.id,\n workspace: n.workspace,\n repoRoot: n.repo_root,\n daemonId: n.daemon_id,\n userOverrides: {},\n policy: {},\n isLocalWorktree: false,\n })),\n createdAt: rm.created_at,\n updatedAt: rm.updated_at,\n };\n process.stderr.write(`[adhdev-mcp] Loaded mesh config from cloud API\\n`);\n }\n } catch (e: any) {\n process.stderr.write(`[adhdev-mcp] Cloud mesh fetch failed, falling back to local: ${e.message}\\n`);\n }\n }\n\n // Priority 3: 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 ${opts.mode === 'cloud' ? 'cloud or local' : '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.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.81' },\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); 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_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_task_history': text = await meshTaskHistory(meshCtx, a as any); break;\n case 'mesh_reconcile_ledger': text = await meshReconcileLedger(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 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, daemon_id: a.daemon_id });\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 'send_chat': {\n const text = await sendChat(transport, { message: a.message, session_id: a.session_id, daemon_id: a.daemon_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, daemon_id: a.daemon_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, daemon_id: a.daemon_id, 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, daemon_id: a.daemon_id, 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, daemon_id: a.daemon_id, 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, daemon_id: a.daemon_id });\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, daemon_id: a.daemon_id });\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 daemon_id: a.daemon_id,\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 daemon_id: a.daemon_id,\n type: a.type,\n });\n return { content: [{ type: 'text', text }] };\n }\n case 'check_pending': {\n const text = await checkPending(transport, { daemon_id: a.daemon_id, 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","/**\n * CloudTransport — HTTP client for ADHDev cloud API (api.adhf.dev)\n *\n * Uses shortcuts API: /api/v1/shortcuts/:targetId/*\n * Requires an API key (adk_*) with appropriate scopes.\n */\n\nconst DEFAULT_BASE_URL = 'https://api.adhf.dev';\n\nexport interface CloudTransportOptions {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class CloudTransport {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(opts: CloudTransportOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n private headers(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n };\n }\n\n async listRemoteMeshes(): Promise<{ meshes: any[] }> {\n const res = await fetch(`${this.baseUrl}/api/v1/repo-meshes`, { headers: this.headers() });\n if (!res.ok) throw new Error(`List remote meshes failed: ${res.status}`);\n return res.json() as any;\n }\n\n async createRemoteMesh(data: {\n name: string;\n repo_identity: string;\n repo_remote_url?: string;\n default_branch?: string;\n policy?: string;\n }): Promise<{ mesh: any }> {\n const res = await fetch(`${this.baseUrl}/api/v1/repo-meshes`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(data),\n });\n if (!res.ok) throw new Error(`Create remote mesh failed: ${res.status}`);\n return res.json() as any;\n }\n\n async deleteRemoteMesh(meshId: string): Promise<void> {\n const res = await fetch(`${this.baseUrl}/api/v1/repo-meshes/${encodeURIComponent(meshId)}`, {\n method: 'DELETE',\n headers: this.headers(),\n });\n if (!res.ok) throw new Error(`Delete remote mesh failed: ${res.status}`);\n }\n\n async listDaemons(): Promise<any> {\n const res = await fetch(`${this.baseUrl}/api/v1/daemons`, { headers: this.headers() });\n if (!res.ok) throw new Error(`List daemons failed: ${res.status}`);\n return res.json() as any;\n }\n\n async getStatus(targetId: string): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/status`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Status failed: ${res.status}`);\n return res.json() as any;\n }\n\n /** Get all sessions for a daemon (returns CompactSessionEntry[]). */\n async getDaemonStatus(daemonId: string): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/daemons/${encodeURIComponent(daemonId)}/status`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Daemon status failed: ${res.status}`);\n return res.json() as any;\n }\n\n async readChat(targetId: string, opts: { limit?: number; sessionId?: string } = {}): Promise<any> {\n const params = new URLSearchParams();\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.sessionId) params.set('sessionId', opts.sessionId);\n const qs = params.toString() ? `?${params}` : '';\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/chat${qs}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Read chat failed: ${res.status}`);\n return res.json() as any;\n }\n\n async getChatDebugBundle(\n targetId: string,\n opts: { sessionId?: string; agentType?: string; tailLimit?: number; delivery?: 'daemon_file' | 'inline' } = {},\n ): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/chat/debug`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({\n ...(opts.agentType ? { agentType: opts.agentType } : {}),\n ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),\n ...(opts.tailLimit ? { tailLimit: opts.tailLimit } : {}),\n ...(opts.delivery ? { delivery: opts.delivery } : {}),\n }),\n },\n );\n if (!res.ok) throw new Error(`Chat debug bundle failed: ${res.status}`);\n return res.json() as any;\n }\n\n async sendChat(targetId: string, message: string, opts: { sessionId?: string; ideType?: string } = {}): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/chat`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ message, ...opts }),\n },\n );\n if (!res.ok) throw new Error(`Send chat failed: ${res.status}`);\n return res.json() as any;\n }\n\n async approve(targetId: string, action: 'approve' | 'reject', agentType?: string): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(targetId)}/approve`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify({ action, ...(agentType ? { agentType } : {}) }),\n },\n );\n if (!res.ok) throw new Error(`Approve failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitStatus(daemonId: string, workspace: string, includeDiff = true, refreshUpstream = false): Promise<any> {\n const params = new URLSearchParams({ workspace, includeDiff: String(includeDiff), refreshUpstream: String(refreshUpstream) });\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-status?${params}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Git status failed: ${res.status}`);\n return res.json() as any;\n }\n\n async stop(daemonId: string, opts: { id?: string; type?: string; dir?: string }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/stop`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Stop failed: ${res.status}`);\n return res.json() as any;\n }\n\n async launch(daemonId: string, opts: { type: string; dir?: string; model?: string; settings?: Record<string, any> }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/launch`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Launch failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitLog(daemonId: string, workspace: string, opts: { limit?: number; file?: string; since?: string; until?: string } = {}): Promise<any> {\n const params = new URLSearchParams({ workspace });\n if (opts.limit) params.set('limit', String(opts.limit));\n if (opts.file) params.set('file', opts.file);\n if (opts.since) params.set('since', opts.since);\n if (opts.until) params.set('until', opts.until);\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-log?${params}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Git log failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitDiff(daemonId: string, workspace: string, opts: { file?: string; maxLines?: number; staged?: boolean } = {}): Promise<any> {\n const params = new URLSearchParams({ workspace });\n if (opts.file) params.set('file', opts.file);\n if (opts.maxLines) params.set('maxLines', String(opts.maxLines));\n if (opts.staged) params.set('staged', 'true');\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-diff?${params}`,\n { headers: this.headers() },\n );\n if (!res.ok) throw new Error(`Git diff failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitPush(daemonId: string, opts: { workspace: string; remote?: string; branch?: string }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-push`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Git push failed: ${res.status}`);\n return res.json() as any;\n }\n\n async gitCheckpoint(daemonId: string, opts: { workspace: string; message: string; includeUntracked?: boolean }): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/git-checkpoint`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(opts),\n },\n );\n if (!res.ok) throw new Error(`Git checkpoint failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshCloneNode(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/clone-node`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh clone node failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshRemoveNode(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/remove-node`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh remove node failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshCleanupSessions(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/cleanup-sessions`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh cleanup sessions failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshEnqueueTask(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/enqueue`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh enqueue task failed: ${res.status}`);\n return res.json() as any;\n }\n\n async meshRefineNode(daemonId: string, payload: any): Promise<any> {\n const res = await fetch(\n `${this.baseUrl}/api/v1/shortcuts/${encodeURIComponent(daemonId)}/mesh/refine-node`,\n {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(payload),\n },\n );\n if (!res.ok) throw new Error(`Mesh refine node failed: ${res.status}`);\n return res.json() as any;\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.listDaemons();\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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:\n 'List all connected agent sessions. In cloud mode, fetches session state from each daemon ' +\n '(data is sourced from daemon WS status reports, up to 30s stale). ' +\n 'Pass daemon_id to scope to a single daemon.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit to list sessions across all daemons.',\n },\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listSessions(\n transport: McpTransport,\n args: { daemon_id?: string; format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n if (isLocalTransport(transport)) {\n // Local: 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\n // Cloud: UserSessionDO /list-daemons intentionally strips sessions[] (P2P architecture —\n // session data flows to dashboard via P2P DataChannel, not server WS).\n // MCP must fetch sessions directly from each DaemonConnectionDO's WS status cache.\n return listSessionsCloud(transport, args.daemon_id, asJson);\n}\n\nasync function listSessionsCloud(\n transport: CloudTransport,\n daemonId: string | undefined,\n asJson: boolean,\n): Promise<string> {\n const collected: Array<{ daemonId: string; session: any }> = [];\n\n if (daemonId) {\n const daemonStatus = await transport.getDaemonStatus(daemonId);\n for (const s of daemonStatus?.sessions ?? []) {\n collected.push({ daemonId, session: s });\n }\n } else {\n const data = await transport.listDaemons();\n const daemons: any[] = data?.daemons ?? [];\n\n // Batch 5 at a time to avoid flooding the API\n for (let i = 0; i < daemons.length; i += 5) {\n await Promise.allSettled(\n daemons.slice(i, i + 5).map(async (d) => {\n try {\n const daemonStatus = await transport.getDaemonStatus(d.id);\n for (const s of daemonStatus?.sessions ?? []) {\n collected.push({ daemonId: d.id, session: s });\n }\n } catch {\n // skip unreachable daemons\n }\n }),\n );\n }\n }\n\n if (asJson) {\n return JSON.stringify({\n sessions: collected.map(({ daemonId: dId, session: s }) => ({\n daemon_id: dId,\n id: s.id,\n type: s.providerType ?? 'unknown',\n status: s.status ?? null,\n workspace: s.workspace ?? null,\n })),\n }, null, 2);\n }\n\n if (collected.length === 0) return 'No active sessions.';\n const lines = collected.map(({ daemonId: dId, session: s }) => {\n const parts = [\n `daemon: ${dId}`,\n `session: ${s.id}`,\n `type: ${s.providerType ?? 'unknown'}`,\n ];\n if (s.status) parts.push(`status: ${s.status}`);\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n return parts.join(', ');\n });\n return `Sessions (${collected.length}):\\n${lines.join('\\n')}`;\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 all connected daemons (machines running the ADHDev agent). ' +\n 'Use this to discover daemon IDs before calling launch_session, git_status, or other tools that require daemon_id. ' +\n 'In local mode returns the single standalone daemon info.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listDaemons(\n transport: McpTransport,\n args: { format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n if (isLocalTransport(transport)) {\n // Local: single standalone 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\n // Cloud: full daemon list from UserSessionDO\n const data = await transport.listDaemons();\n const daemons: any[] = data?.daemons ?? [];\n\n if (asJson) {\n return JSON.stringify({\n daemons: daemons.map((d) => ({\n id: d.id,\n hostname: d.hostname ?? null,\n platform: d.platform ?? null,\n nickname: d.nickname ?? null,\n version: d.version ?? null,\n p2p_available: d.p2p?.available ?? null,\n cdp_connected: d.cdpConnected ?? null,\n })),\n }, null, 2);\n }\n\n if (daemons.length === 0) return 'No connected daemons.';\n const lines = daemons.map((d) => {\n const parts = [`id: ${d.id}`];\n if (d.nickname) parts.push(`nickname: ${d.nickname}`);\n if (d.hostname) parts.push(`hostname: ${d.hostname}`);\n if (d.platform) parts.push(`platform: ${d.platform}`);\n if (d.version) parts.push(`version: ${d.version}`);\n if (d.p2p?.available != null) parts.push(`p2p: ${d.p2p.available ? 'yes' : 'no'}`);\n return parts.join(', ');\n });\n return `Daemons (${daemons.length}):\\n${lines.join('\\n')}`;\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit for local mode.',\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: McpTransport,\n args: { session_id?: string; limit?: number; daemon_id?: string; format?: 'text' | 'json'; compact?: boolean },\n): Promise<string> {\n const limit = args.limit ?? 50;\n\n if (isLocalTransport(transport)) {\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\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = args.session_id ? `${args.daemon_id}:session:${args.session_id}` : args.daemon_id;\n const result = await transport.readChat(targetId, { limit, sessionId: args.session_id });\n const annotated = annotateRapidReadChatAdvisory(result as Record<string, any>, {\n key: `cloud:${args.daemon_id}:${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 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 (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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit for local mode.',\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: McpTransport,\n args: {\n session_id?: string;\n daemon_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 let result: any;\n if (isLocalTransport(transport)) {\n result = await transport.command('get_chat_debug_bundle', commandArgs);\n } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = `${args.daemon_id}:session:${sessionId}`;\n result = await transport.getChatDebugBundle(targetId, {\n sessionId,\n agentType: args.agent_type,\n tailLimit,\n delivery,\n });\n }\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 { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Omit for local mode.',\n },\n },\n required: ['message'],\n },\n};\n\nexport async function sendChat(\n transport: McpTransport,\n args: { message: string; session_id?: string; daemon_id?: string },\n): Promise<string> {\n if (!args.message?.trim()) throw new Error('message is required');\n\n if (isLocalTransport(transport)) {\n // LocalTransport\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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = args.session_id ? `${args.daemon_id}:session:${args.session_id}` : args.daemon_id;\n const result = await transport.sendChat(targetId, args.message, {\n ...(args.session_id ? { sessionId: args.session_id } : {}),\n });\n if (result?.success === false) return `Error: ${result.error ?? 'send_chat failed'}`;\n return 'Message sent.';\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only).',\n },\n },\n required: ['action'],\n },\n};\n\nexport async function approve(\n transport: McpTransport,\n args: { action: 'approve' | 'reject'; session_id?: string; daemon_id?: string },\n): Promise<string> {\n const action = args.action === 'reject' ? 'reject' : 'approve';\n\n if (isLocalTransport(transport)) {\n // LocalTransport\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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const targetId = args.session_id ? `${args.daemon_id}:session:${args.session_id}` : args.daemon_id;\n const result = await transport.approve(targetId, action);\n if (result?.success === false) return `Error: ${result.error ?? 'approve failed'}`;\n return `Action ${action}d.`;\n}\n","import type { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 'Local mode only — screenshots require direct P2P access to the daemon and are not available in cloud mode.',\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: McpTransport,\n args: { session_id?: string },\n): Promise<{ type: 'image'; data: string; mimeType: string } | { type: 'text'; text: string }> {\n let result: any;\n\n if (isLocalTransport(transport)) {\n result = await transport.command('screenshot', {\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n });\n } else {\n // CloudTransport: use shortcuts status endpoint — screenshot not on shortcuts, fall back to error\n return { type: 'text', text: 'Screenshots are not available in cloud mode. Run adhdev mcp in local mode (requires standalone daemon).' };\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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitStatus(\n transport: McpTransport,\n args: { workspace: string; include_diff?: boolean; daemon_id?: string; format?: 'text' | 'json' },\n): Promise<string> {\n let status: any;\n let diffSummary: any;\n\n if (isLocalTransport(transport)) {\n const statusResult = await transport.command('git_status', {\n workspace: args.workspace,\n });\n status = 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 } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitStatus(\n args.daemon_id,\n args.workspace,\n args.include_diff !== false,\n );\n if (result?.error) {\n if (args.format === 'json') return JSON.stringify({ error: result.error }, null, 2);\n return `Error: ${result.error}`;\n }\n status = result?.status;\n diffSummary = result?.diff;\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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n ...FORMAT_PROP,\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitLog(\n transport: McpTransport,\n args: {\n workspace: string;\n limit?: number;\n file?: string;\n since?: string;\n until?: string;\n daemon_id?: 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;\n if (isLocalTransport(transport)) {\n raw = 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 } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitLog(args.daemon_id, args.workspace, {\n limit,\n file: args.file,\n since: args.since,\n until: args.until,\n });\n raw = result?.log ?? result;\n }\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, McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\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: McpTransport,\n args: {\n workspace: string;\n file?: string;\n max_lines?: number;\n staged?: boolean;\n daemon_id?: string;\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 if (isLocalTransport(transport)) {\n return localGitDiff(transport, args.workspace, args.file, maxLines, staged, args.format);\n }\n\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitDiff(args.daemon_id, args.workspace, {\n file: args.file,\n maxLines,\n staged,\n });\n\n if (result?.error) {\n if (args.format === 'json') return JSON.stringify({ error: result.error }, null, 2);\n return `Git diff error: ${result.error}`;\n }\n\n return formatDiffResult(result, 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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n },\n required: ['workspace', 'message'],\n },\n};\n\nexport async function gitCheckpoint(\n transport: McpTransport,\n args: {\n workspace: string;\n message: string;\n include_untracked?: boolean;\n daemon_id?: string;\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;\n if (isLocalTransport(transport)) {\n raw = await transport.command('git_checkpoint', {\n workspace: args.workspace,\n message,\n includeUntracked: args.include_untracked ?? false,\n });\n raw = raw?.checkpoint ?? raw;\n } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitCheckpoint(args.daemon_id, {\n workspace: args.workspace,\n message,\n includeUntracked: args.include_untracked ?? false,\n });\n raw = result?.checkpoint ?? result;\n }\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 { McpTransport } from '../transports/mode.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n },\n required: ['workspace'],\n },\n};\n\nexport async function gitPush(\n transport: McpTransport,\n args: {\n workspace: string;\n remote?: string;\n branch?: string;\n daemon_id?: string;\n },\n): Promise<string> {\n let raw: any;\n\n if (isLocalTransport(transport)) {\n raw = 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 } else {\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.gitPush(args.daemon_id, {\n workspace: args.workspace,\n remote: args.remote,\n branch: args.branch,\n });\n raw = result?.push ?? result;\n }\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 { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only). Required in cloud mode.',\n },\n },\n required: ['type'],\n },\n};\n\nexport async function launchSession(\n transport: McpTransport,\n args: { type: string; workspace?: string; model?: string; daemon_id?: string },\n): Promise<string> {\n if (isLocalTransport(transport)) {\n // LocalTransport\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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.launch(args.daemon_id, {\n type: args.type,\n dir: args.workspace,\n model: args.model,\n });\n if (result?.success === false || result?.error) 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 { McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only, required).',\n },\n type: {\n type: 'string',\n description:\n 'Provider type (e.g. hermes-cli, claude-cli). Local mode auto-resolves from session_id if omitted; cloud mode forwards the session_id and omits type unless explicitly provided.',\n },\n },\n required: ['session_id'],\n },\n};\n\nexport async function stopSession(\n transport: McpTransport,\n args: { session_id: string; daemon_id?: string; type?: string },\n): Promise<string> {\n if (isLocalTransport(transport)) {\n const local = transport;\n let resolvedType = args.type;\n\n // Auto-resolve type from session status if not provided\n if (!resolvedType) {\n const status = await local.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 local.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\n // CloudTransport\n if (!args.daemon_id) throw new Error('daemon_id is required in cloud mode');\n const result = await transport.stop(args.daemon_id, {\n id: args.session_id,\n ...(args.type ? { type: args.type } : {}),\n });\n if (result?.success === false || result?.error) return `Error: ${result.error ?? 'stop failed'}`;\n return `Session ${args.session_id} stopped.`;\n}\n","import type { CommandTransport, McpTransport } from '../transports/mode.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } 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 daemon_id: {\n type: 'string',\n description: 'Daemon ID to check (cloud mode). Omit to check all daemons.',\n },\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function checkPending(\n transport: McpTransport,\n args: { daemon_id?: string; format?: 'text' | 'json' },\n): Promise<string> {\n if (isLocalTransport(transport)) {\n return checkPendingLocal(transport, args.format);\n }\n return checkPendingCloud(transport, args.daemon_id, args.format);\n}\n\nasync function checkPendingLocal(\n transport: CommandTransport,\n 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 (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\nasync function checkPendingCloud(\n transport: CloudTransport,\n daemonId?: string,\n format?: 'text' | 'json',\n): Promise<string> {\n const pending: Array<{ daemonId: string; session: any }> = [];\n\n if (daemonId) {\n const daemonStatus = await transport.getDaemonStatus(daemonId);\n const sessions: any[] = daemonStatus?.sessions ?? [];\n for (const s of sessions) {\n if (s.status === 'waiting_approval') pending.push({ daemonId, session: s });\n }\n } else {\n const data = await transport.listDaemons();\n const daemons: any[] = data?.daemons ?? [];\n\n // Process in batches of 5 to avoid flooding the API with concurrent requests\n for (let i = 0; i < daemons.length; i += 5) {\n await Promise.allSettled(\n daemons.slice(i, i + 5).map(async (d) => {\n try {\n const daemonStatus = await transport.getDaemonStatus(d.id);\n const sessions: any[] = daemonStatus?.sessions ?? [];\n for (const s of sessions) {\n if (s.status === 'waiting_approval') pending.push({ daemonId: d.id, session: s });\n }\n } catch {\n // skip unreachable daemons\n }\n }),\n );\n }\n }\n\n if (format === 'json') {\n return JSON.stringify({\n pending: pending.map(({ daemonId: dId, session: s }) => ({\n daemon_id: dId,\n session_id: s.id,\n workspace: s.workspace ?? null,\n type: s.providerType ?? null,\n modal_message: null,\n buttons: [],\n })),\n }, null, 2);\n }\n\n if (pending.length === 0) return 'No sessions waiting for approval.';\n const lines = pending.map(({ daemonId: dId, session: s }) => {\n const parts = [`daemon_id: ${dId}`, `session_id: ${s.id}`];\n if (s.workspace) parts.push(`workspace: ${s.workspace}`);\n if (s.providerType) parts.push(`type: ${s.providerType}`);\n parts.push('(use read_chat to see the approval prompt)');\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":["slice","result","result","annotated","lines","result","result","result","id","result","os","server","stdioTransport"]}
|