adhdev 0.9.61 → 0.9.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/transports/local.ts","../src/transports/cloud.ts","../src/tools/list-sessions.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/launch-session.ts","../src/tools/check-pending.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 { 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 { LAUNCH_SESSION_TOOL, launchSession } from './tools/launch-session.js';\nimport { CHECK_PENDING_TOOL, checkPending } from './tools/check-pending.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}\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 // 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_SESSIONS_TOOL,\n LAUNCH_SESSION_TOOL,\n CHECK_PENDING_TOOL,\n READ_CHAT_TOOL,\n SEND_CHAT_TOOL,\n APPROVE_TOOL,\n GIT_STATUS_TOOL,\n ...(isLocal ? [SCREENSHOT_TOOL] : []),\n ];\n\n const server = new Server(\n { name: 'adhdev-mcp-server', version: '0.9.61' },\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_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 '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 '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 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 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 '../transports/local.js';\nimport type { CloudTransport } from '../transports/cloud.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 ('getStatus' in transport) {\n // Local: single daemon, status endpoint has full SessionEntry[]\n const status = await (transport as LocalTransport).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 as CloudTransport, 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 { 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). Omit to use the active session.',\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 ('command' in transport) {\n const result = await (transport as LocalTransport).command('read_chat', {\n ...(args.session_id ? { targetSessionId: args.session_id } : {}),\n limit,\n });\n return formatChatResult(result, args.session_id, args.format);\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 as CloudTransport).readChat(targetId, { limit, sessionId: args.session_id });\n return formatChatResult(result, args.session_id, args.format);\n}\n\nfunction formatChatResult(result: any, sessionId?: string, format?: 'text' | 'json'): 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(-50).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(-50).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';\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 ('command' in transport) {\n // LocalTransport\n const result = await (transport as LocalTransport).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 as CloudTransport).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';\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 ('command' in transport) {\n // LocalTransport\n const result = await (transport as LocalTransport).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 as CloudTransport).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';\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 ('command' in transport) {\n result = await (transport as LocalTransport).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 { 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 ('command' in transport) {\n const statusResult = await (transport as LocalTransport).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 as LocalTransport).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 as CloudTransport).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';\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 ('command' in 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 as LocalTransport).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 as CloudTransport).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 { 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 ('getStatus' in transport) {\n return checkPendingLocal(transport as LocalTransport, args.format);\n }\n return checkPendingCloud(transport as CloudTransport, 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 * @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} {\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\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 === '--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\n const mode = apiKey ? 'cloud' : 'local';\n return { mode, port, password, apiKey, baseUrl };\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\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 --help Show this help\n\nEnvironment variables:\n ADHDEV_API_KEY API key (cloud mode)\n ADHDEV_PASSWORD Daemon password (local mode)\n\nLocal mode tools: list_sessions, launch_session, check_pending, read_chat, send_chat, approve, git_status, screenshot\nCloud mode tools: list_sessions, launch_session, check_pending, read_chat, send_chat, approve, git_status\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"]}
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/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';\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}\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 // 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.63' },\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). Omit to use the active session.',\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 limit,\n });\n return formatChatResult(result, args.session_id, args.format);\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);\n}\n\nfunction formatChatResult(result: any, sessionId?: string, format?: 'text' | 'json'): 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(-50).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(-50).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 * @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} {\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\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 === '--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\n const mode = apiKey ? 'cloud' : 'local';\n return { mode, port, password, apiKey, baseUrl };\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\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 --help Show this help\n\nEnvironment variables:\n ADHDEV_API_KEY API key (cloud mode)\n ADHDEV_PASSWORD Daemon password (local mode)\n\nLocal mode 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\nCloud mode 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\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"]}