adhdev 0.9.76-rc.5 → 0.9.76-rc.7
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/cli/index.js +26 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +26 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/vendor/mcp-server/index.js +160 -20
- package/vendor/mcp-server/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts","../src/transports/local.ts","../src/transports/cloud.ts","../src/transports/mode.ts","../src/tools/list-sessions.ts","../src/tools/list-daemons.ts","../src/tools/read-chat.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","../src/tools/mesh-tools.ts","../src/index.ts"],"sourcesContent":["/**\n * ADHDev MCP Server\n *\n * Exposes IDE agent sessions as MCP tools via stdio transport.\n * Two modes:\n * local — talks to standalone daemon at localhost:3847\n * cloud — talks to ADHDev cloud API with an API key\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { LocalTransport } from './transports/local.js';\nimport { CloudTransport } from './transports/cloud.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 { 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 meshLaunchSession, meshGitStatus, meshCheckpoint, meshApprove,\n type MeshContext,\n} from './tools/mesh-tools.js';\n\nexport interface AdhdevMcpServerOptions {\n mode: 'local' | 'cloud';\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 startMcpServer(opts: AdhdevMcpServerOptions): Promise<void> {\n const transport =\n opts.mode === 'cloud'\n ? new CloudTransport({ apiKey: opts.apiKey!, baseUrl: opts.baseUrl })\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 : `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 requireApprovalForDestructiveGit: true,\n dirtyWorkspaceBehavior: 'warn',\n maxParallelTasks: 2,\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) {\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 const meshCtx: MeshContext = { mesh, transport };\n\n // Build coordinator system prompt\n let coordinatorPrompt = '';\n try {\n const { buildCoordinatorSystemPrompt } = await import('@adhdev/daemon-core');\n coordinatorPrompt = buildCoordinatorSystemPrompt({ mesh });\n } catch {\n coordinatorPrompt = `You are a Repo Mesh Coordinator for \"${mesh.name}\" (${mesh.repoIdentity}). Use mesh_* tools to orchestrate work.`;\n }\n\n const server = new Server(\n { name: 'adhdev-mcp-server', version: '0.9.75' },\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_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_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_checkpoint': text = await meshCheckpoint(meshCtx, a as any); break;\n case 'mesh_approve': text = await meshApprove(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 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 '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 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();\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();\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();\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();\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();\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();\n }\n\n async gitStatus(daemonId: string, workspace: string, includeDiff = true): Promise<any> {\n const params = new URLSearchParams({ workspace, includeDiff: String(includeDiff) });\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();\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();\n }\n\n async launch(daemonId: string, opts: { type: string; dir?: string; model?: string }): 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();\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();\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();\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();\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();\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 { LocalTransport } from './local.js';\nimport type { CloudTransport } from './cloud.js';\n\n/**\n * Local and cloud transports are intentionally detected by an operation that is\n * unique to standalone/local mode. CloudTransport also exposes getStatus(targetId),\n * so checking for getStatus incorrectly routes cloud tools through local code.\n */\nexport function isLocalTransport(\n transport: LocalTransport | CloudTransport,\n): transport is LocalTransport {\n return typeof (transport as { command?: unknown }).command === 'function';\n}\n","import type { LocalTransport } from '../transports/local.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } from '../transports/mode.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 ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function readChat(\n transport: LocalTransport | CloudTransport,\n args: { session_id?: string; limit?: number; daemon_id?: string; format?: 'text' | 'json' },\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 return formatChatResult(result, args.session_id, args.format, limit);\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 return formatChatResult(result, args.session_id, args.format, limit);\n}\n\nfunction formatChatResult(result: any, sessionId?: string, format?: 'text' | 'json', limit = 50): 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\n if (format === 'json') {\n return JSON.stringify({\n session_id: sessionId ?? null,\n messages: messages.slice(-limit).map((m: any) => ({\n role: m.role,\n kind: m.kind ?? null,\n content: typeof m.content === 'string'\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map((p: any) => (typeof p === 'string' ? p : p?.text ?? '')).join('')\n : '',\n timestamp: m.timestamp ?? null,\n })),\n }, null, 2);\n }\n\n if (messages.length === 0) return 'No messages in chat.';\n const lines = messages.slice(-limit).map((m: any) => {\n const role = m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Agent' : m.role;\n const content = typeof m.content === 'string'\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map((p: any) => (typeof p === 'string' ? p : p?.text ?? '')).join('')\n : '';\n const truncated = content.length > 500 ? `${content.slice(0, 500)}…` : content;\n return `[${role}] ${truncated}`;\n });\n return lines.join('\\n\\n');\n}\n","import type { LocalTransport } from '../transports/local.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.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: LocalTransport | CloudTransport,\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: LocalTransport,\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 { LocalTransport } from '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.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: LocalTransport | CloudTransport,\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 { LocalTransport } from '../transports/local.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: LocalTransport | CloudTransport,\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: LocalTransport,\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","/**\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 * 8 tools: mesh_status, mesh_list_nodes, mesh_send_task, mesh_read_chat,\n * mesh_launch_session, mesh_git_status, mesh_checkpoint, mesh_approve\n */\n\nimport type { LocalTransport } from '../transports/local.js';\nimport { CloudTransport } from '../transports/cloud.js';\nimport { isLocalTransport } from '../transports/mode.js';\nimport type { LocalMeshEntry, LocalMeshNodeEntry, RepoMeshPolicy } from '@adhdev/daemon-core';\n\nexport interface MeshContext {\n mesh: LocalMeshEntry;\n transport: LocalTransport | CloudTransport;\n /** Daemon ID for this local machine (local mode) */\n localDaemonId?: string;\n}\n\n// ─── Helpers ────────────────────────────────────\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\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\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. Use this to decide which node to send work to.',\n inputSchema: {\n type: 'object' as const,\n properties: {},\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 },\n};\n\nexport const MESH_SEND_TASK_TOOL = {\n name: 'mesh_send_task',\n description: 'Send a natural-language task to an agent session on a mesh node. The agent will execute the task autonomously.',\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 },\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 this to check progress.',\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 tail: { type: 'number', description: 'Number of recent messages to return (default: 10).' },\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.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n type: { type: 'string', description: 'Provider type (e.g. \"claude-cli\", \"gemini-cli\", \"cursor\").' },\n },\n required: ['node_id', 'type'],\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_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 ALL_MESH_TOOLS = [\n MESH_STATUS_TOOL,\n MESH_LIST_NODES_TOOL,\n MESH_SEND_TASK_TOOL,\n MESH_READ_CHAT_TOOL,\n MESH_LAUNCH_SESSION_TOOL,\n MESH_GIT_STATUS_TOOL,\n MESH_CHECKPOINT_TOOL,\n MESH_APPROVE_TOOL,\n];\n\n// ─── Tool Implementations ───────────────────────\n\nexport async function meshStatus(ctx: MeshContext): Promise<string> {\n const { mesh, transport } = ctx;\n const results: any[] = [];\n\n for (const node of mesh.nodes) {\n const entry: any = {\n nodeId: node.id,\n workspace: node.workspace,\n };\n\n try {\n if (!isLocalTransport(transport) && node.daemonId) {\n const result = await (transport as CloudTransport).gitStatus(node.daemonId, node.workspace, false);\n const status = result?.status ?? result;\n entry.health = status?.isGitRepo ? (status?.isDirty ? 'dirty' : 'online') : 'degraded';\n entry.branch = status?.branch;\n entry.isDirty = status?.isDirty;\n entry.uncommittedChanges = status?.uncommittedChanges ?? 0;\n } else if (isLocalTransport(transport)) {\n const statusResult = await transport.command('git_status', { workspace: node.workspace });\n const status = statusResult?.status ?? statusResult;\n entry.health = status?.isGitRepo ? (status?.isDirty ? 'dirty' : 'online') : 'degraded';\n entry.branch = status?.branch;\n entry.isDirty = status?.isDirty;\n entry.uncommittedChanges = status?.uncommittedChanges ?? 0;\n } else {\n entry.health = 'unknown';\n entry.note = 'No daemonId available for cloud status probe';\n }\n } catch (e: any) {\n entry.health = 'degraded';\n entry.error = e.message;\n }\n\n results.push(entry);\n }\n\n return JSON.stringify({\n meshId: mesh.id,\n meshName: mesh.name,\n repoIdentity: mesh.repoIdentity,\n policy: mesh.policy,\n refreshedAt: new Date().toISOString(),\n nodes: results,\n }, null, 2);\n}\n\nexport async function meshListNodes(ctx: MeshContext): Promise<string> {\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 isLocalWorktree: n.isLocalWorktree,\n policy: n.policy,\n userOverrides: n.userOverrides,\n })),\n }, null, 2);\n}\n\nexport async function meshSendTask(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; message: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, 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 if (isLocalTransport(ctx.transport)) {\n await ctx.transport.command('send_chat', {\n message: args.message,\n sessionId: args.session_id,\n });\n return JSON.stringify({ success: true, nodeId: args.node_id, sessionId: args.session_id });\n } else {\n return JSON.stringify({ error: 'Cloud mesh send_task not yet implemented' });\n }\n}\n\nexport async function meshReadChat(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; tail?: number },\n): Promise<string> {\n findNode(ctx.mesh, args.node_id); // membership check\n\n if (isLocalTransport(ctx.transport)) {\n const result = await ctx.transport.command('read_chat', {\n sessionId: args.session_id,\n tailLimit: args.tail ?? 10,\n });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh read_chat not yet implemented' });\n }\n}\n\nexport async function meshLaunchSession(\n ctx: MeshContext,\n args: { node_id: string; type: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, args.node_id);\n\n if (isLocalTransport(ctx.transport)) {\n const result = await ctx.transport.command('launch_cli', {\n cliType: args.type,\n dir: node.workspace,\n settings: {\n meshNodeFor: ctx.mesh.id,\n launchedByCoordinator: true\n }\n });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh launch_session not yet implemented' });\n }\n}\n\nexport async function meshGitStatus(\n ctx: MeshContext,\n args: { node_id: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, args.node_id);\n\n if (!isLocalTransport(ctx.transport) && node.daemonId) {\n const result = await (ctx.transport as CloudTransport).gitStatus(node.daemonId, node.workspace, true);\n return JSON.stringify({\n nodeId: args.node_id,\n workspace: node.workspace,\n status: result?.status ?? result,\n diff: result?.diff ?? null,\n }, null, 2);\n } else if (isLocalTransport(ctx.transport)) {\n const statusResult = await ctx.transport.command('git_status', {\n workspace: node.workspace,\n });\n const diffResult = await ctx.transport.command('git_diff_summary', {\n workspace: node.workspace,\n });\n return JSON.stringify({\n nodeId: args.node_id,\n workspace: node.workspace,\n status: statusResult?.status ?? statusResult,\n diff: diffResult?.diffSummary ?? diffResult,\n }, null, 2);\n } else {\n return JSON.stringify({ error: 'No daemonId available for cloud git_status probe' });\n }\n}\n\nexport async function meshCheckpoint(\n ctx: MeshContext,\n args: { node_id: string; message: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, 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 ctx.transport.command('git_checkpoint', {\n workspace: node.workspace,\n message: args.message,\n });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh checkpoint not yet implemented' });\n }\n}\n\nexport async function meshApprove(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; action: string },\n): Promise<string> {\n findNode(ctx.mesh, args.node_id); // membership check\n\n if (isLocalTransport(ctx.transport)) {\n const result = await ctx.transport.command('resolve_action', {\n sessionId: args.session_id,\n action: args.action === 'reject' ? 'reject' : 'approve',\n });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh approve not yet implemented' });\n }\n}\n","/**\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 */\n\nimport { startMcpServer } from './server.js';\n\nfunction parseArgs(argv: string[]): {\n mode: 'local' | 'cloud';\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\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 === '--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 && process.env.ADHDEV_API_KEY) apiKey = process.env.ADHDEV_API_KEY;\n if (!password && process.env.ADHDEV_PASSWORD) password = process.env.ADHDEV_PASSWORD;\n if (!meshId && process.env.ADHDEV_MESH_ID) meshId = process.env.ADHDEV_MESH_ID;\n\n const mode = apiKey ? 'cloud' : 'local';\n return { mode, port, password, apiKey, baseUrl, meshId };\n}\n\nfunction printHelp(): void {\n console.error(`\nadhdev-mcp — ADHDev 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 --repo-mesh <mesh_id> Mesh mode (coordinator-scoped tools)\n\nOptions:\n --port <n> Standalone daemon port (default: 3847)\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\nStandard tools: list_daemons, list_sessions, launch_session, stop_session, check_pending, read_chat, send_chat, approve, git_status, git_log, git_diff, git_checkpoint, git_push, screenshot\nMesh tools: mesh_status, mesh_list_nodes, mesh_send_task, mesh_read_chat, mesh_launch_session, mesh_git_status, mesh_checkpoint, mesh_approve\n`.trim());\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"],"mappings":"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","names":["result","result","result","result","id","result","server","stdioTransport"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/transports/local.ts","../src/transports/cloud.ts","../src/transports/ipc.ts","../src/transports/mode.ts","../src/tools/list-sessions.ts","../src/tools/list-daemons.ts","../src/tools/read-chat.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","../src/tools/mesh-tools.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 { 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(`\nadhdev-mcp — ADHDev 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 --repo-mesh <mesh_id> Mesh mode (coordinator-scoped tools)\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: list_daemons, list_sessions, launch_session, stop_session, check_pending, read_chat, send_chat, approve, git_status, git_log, git_diff, git_checkpoint, git_push, screenshot\nMesh tools: mesh_status, mesh_list_nodes, mesh_send_task, mesh_read_chat, mesh_launch_session, mesh_git_status, mesh_checkpoint, mesh_approve\n`.trim());\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 * 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 {\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 { 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 meshLaunchSession, meshGitStatus, meshCheckpoint, meshApprove,\n type MeshContext,\n} 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 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 requireApprovalForDestructiveGit: true,\n dirtyWorkspaceBehavior: 'warn',\n maxParallelTasks: 2,\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 const meshCtx: MeshContext = { mesh, transport };\n\n // Build coordinator system prompt\n let coordinatorPrompt = '';\n try {\n const { buildCoordinatorSystemPrompt } = await import('@adhdev/daemon-core');\n coordinatorPrompt = buildCoordinatorSystemPrompt({ mesh });\n } catch {\n coordinatorPrompt = `You are a Repo Mesh Coordinator for \"${mesh.name}\" (${mesh.repoIdentity}). Use mesh_* tools to orchestrate work.`;\n }\n\n const server = new Server(\n { name: 'adhdev-mcp-server', version: '0.9.75' },\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_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_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_checkpoint': text = await meshCheckpoint(meshCtx, a as any); break;\n case 'mesh_approve': text = await meshApprove(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 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 '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 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();\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();\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();\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();\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();\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();\n }\n\n async gitStatus(daemonId: string, workspace: string, includeDiff = true): Promise<any> {\n const params = new URLSearchParams({ workspace, includeDiff: String(includeDiff) });\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();\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();\n }\n\n async launch(daemonId: string, opts: { type: string; dir?: string; model?: string }): 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();\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();\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();\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();\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();\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","/**\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';\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 timeout = setTimeout(() => {\n finish(() => reject(new Error(`Daemon IPC command '${type}' timed out after 15s`)));\n }, 15_000);\n\n const send = () => {\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","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 { 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 ...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' },\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 return formatChatResult(result, args.session_id, args.format, limit);\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 return formatChatResult(result, args.session_id, args.format, limit);\n}\n\nfunction formatChatResult(result: any, sessionId?: string, format?: 'text' | 'json', limit = 50): 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\n if (format === 'json') {\n return JSON.stringify({\n session_id: sessionId ?? null,\n messages: messages.slice(-limit).map((m: any) => ({\n role: m.role,\n kind: m.kind ?? null,\n content: typeof m.content === 'string'\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map((p: any) => (typeof p === 'string' ? p : p?.text ?? '')).join('')\n : '',\n timestamp: m.timestamp ?? null,\n })),\n }, null, 2);\n }\n\n if (messages.length === 0) return 'No messages in chat.';\n const lines = messages.slice(-limit).map((m: any) => {\n const role = m.role === 'user' ? 'User' : m.role === 'assistant' ? 'Agent' : m.role;\n const content = typeof m.content === 'string'\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map((p: any) => (typeof p === 'string' ? p : p?.text ?? '')).join('')\n : '';\n const truncated = content.length > 500 ? `${content.slice(0, 500)}…` : content;\n return `[${role}] ${truncated}`;\n });\n return lines.join('\\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 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","/**\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 * 8 tools: mesh_status, mesh_list_nodes, mesh_send_task, mesh_read_chat,\n * mesh_launch_session, mesh_git_status, mesh_checkpoint, mesh_approve\n */\n\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 type { LocalMeshEntry, LocalMeshNodeEntry, RepoMeshPolicy } 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}\n\n// ─── Helpers ────────────────────────────────────\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\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\nasync function commandForNode(\n ctx: MeshContext,\n node: LocalMeshNodeEntry,\n command: string,\n args: Record<string, unknown> = {},\n): Promise<any> {\n if (ctx.transport instanceof IpcTransport && node.daemonId) {\n return ctx.transport.meshCommand(node.daemonId, command, args);\n }\n if (isLocalTransport(ctx.transport)) {\n return ctx.transport.command(command, args);\n }\n throw new Error(`Command '${command}' requires daemon IPC/local transport for node '${node.id}'`);\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. Use this to decide which node to send work to.',\n inputSchema: {\n type: 'object' as const,\n properties: {},\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 },\n};\n\nexport const MESH_SEND_TASK_TOOL = {\n name: 'mesh_send_task',\n description: 'Send a natural-language task to an agent session on a mesh node. The agent will execute the task autonomously.',\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 },\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 this to check progress.',\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 tail: { type: 'number', description: 'Number of recent messages to return (default: 10).' },\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.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n node_id: { type: 'string', description: 'Target node ID.' },\n type: { type: 'string', description: 'Provider type (e.g. \"claude-cli\", \"gemini-cli\", \"cursor\").' },\n },\n required: ['node_id', 'type'],\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_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 ALL_MESH_TOOLS = [\n MESH_STATUS_TOOL,\n MESH_LIST_NODES_TOOL,\n MESH_SEND_TASK_TOOL,\n MESH_READ_CHAT_TOOL,\n MESH_LAUNCH_SESSION_TOOL,\n MESH_GIT_STATUS_TOOL,\n MESH_CHECKPOINT_TOOL,\n MESH_APPROVE_TOOL,\n];\n\n// ─── Tool Implementations ───────────────────────\n\nexport async function meshStatus(ctx: MeshContext): Promise<string> {\n const { mesh, transport } = ctx;\n const results: any[] = [];\n\n for (const node of mesh.nodes) {\n const entry: any = {\n nodeId: node.id,\n workspace: node.workspace,\n };\n\n try {\n if (!isLocalTransport(transport) && node.daemonId) {\n const result = await (transport as CloudTransport).gitStatus(node.daemonId, node.workspace, false);\n const status = result?.status ?? result;\n entry.health = status?.isGitRepo ? (status?.isDirty ? 'dirty' : 'online') : 'degraded';\n entry.branch = status?.branch;\n entry.isDirty = status?.isDirty;\n entry.uncommittedChanges = status?.uncommittedChanges ?? 0;\n } else if (isLocalTransport(transport)) {\n const statusResult = await commandForNode(ctx, node, 'git_status', { workspace: node.workspace });\n const status = statusResult?.status ?? statusResult;\n entry.health = status?.isGitRepo ? (status?.isDirty ? 'dirty' : 'online') : 'degraded';\n entry.branch = status?.branch;\n entry.isDirty = status?.isDirty;\n entry.uncommittedChanges = status?.uncommittedChanges ?? 0;\n } else {\n entry.health = 'unknown';\n entry.note = 'No daemonId available for cloud status probe';\n }\n } catch (e: any) {\n entry.health = 'degraded';\n entry.error = e.message;\n }\n\n results.push(entry);\n }\n\n return JSON.stringify({\n meshId: mesh.id,\n meshName: mesh.name,\n repoIdentity: mesh.repoIdentity,\n policy: mesh.policy,\n refreshedAt: new Date().toISOString(),\n nodes: results,\n }, null, 2);\n}\n\nexport async function meshListNodes(ctx: MeshContext): Promise<string> {\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 isLocalWorktree: n.isLocalWorktree,\n policy: n.policy,\n userOverrides: n.userOverrides,\n })),\n }, null, 2);\n}\n\nexport async function meshSendTask(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; message: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, 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 if (isLocalTransport(ctx.transport)) {\n await commandForNode(ctx, node, 'send_chat', {\n message: args.message,\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n });\n return JSON.stringify({ success: true, nodeId: args.node_id, sessionId: args.session_id });\n } else {\n return JSON.stringify({ error: 'Cloud mesh send_task not yet implemented' });\n }\n}\n\nexport async function meshReadChat(\n ctx: MeshContext,\n args: { node_id: string; session_id: string; tail?: number },\n): Promise<string> {\n const node = findNode(ctx.mesh, args.node_id); // membership check\n\n if (isLocalTransport(ctx.transport)) {\n const result = await commandForNode(ctx, node, 'read_chat', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n tailLimit: args.tail ?? 10,\n });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh read_chat not yet implemented' });\n }\n}\n\nexport async function meshLaunchSession(\n ctx: MeshContext,\n args: { node_id: string; type: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, args.node_id);\n\n if (isLocalTransport(ctx.transport)) {\n const result = await commandForNode(ctx, node, 'launch_cli', {\n cliType: args.type,\n dir: node.workspace,\n settings: {\n meshNodeFor: ctx.mesh.id,\n launchedByCoordinator: true\n }\n });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh launch_session not yet implemented' });\n }\n}\n\nexport async function meshGitStatus(\n ctx: MeshContext,\n args: { node_id: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, args.node_id);\n\n if (!isLocalTransport(ctx.transport) && node.daemonId) {\n const result = await (ctx.transport as CloudTransport).gitStatus(node.daemonId, node.workspace, true);\n return JSON.stringify({\n nodeId: args.node_id,\n workspace: node.workspace,\n status: result?.status ?? result,\n diff: result?.diff ?? null,\n }, null, 2);\n } else if (isLocalTransport(ctx.transport)) {\n const statusResult = await commandForNode(ctx, node, 'git_status', {\n workspace: node.workspace,\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: statusResult?.status ?? statusResult,\n diff: diffResult?.diffSummary ?? diffResult,\n }, null, 2);\n } else {\n return JSON.stringify({ error: 'No daemonId available for cloud git_status probe' });\n }\n}\n\nexport async function meshCheckpoint(\n ctx: MeshContext,\n args: { node_id: string; message: string },\n): Promise<string> {\n const node = findNode(ctx.mesh, 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 });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh checkpoint not yet implemented' });\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 = findNode(ctx.mesh, args.node_id); // membership check\n\n if (isLocalTransport(ctx.transport)) {\n const result = await commandForNode(ctx, node, 'resolve_action', {\n sessionId: args.session_id,\n targetSessionId: args.session_id,\n action: args.action === 'reject' ? 'reject' : 'approve',\n });\n return JSON.stringify(result, null, 2);\n } else {\n return JSON.stringify({ error: 'Cloud mesh approve not yet implemented' });\n }\n}\n"],"mappings":"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","names":["result","result","result","result","id","result","server","stdioTransport"]}
|