adhdev 0.9.60 → 0.9.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +3 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/vendor/mcp-server/index.js +58 -38
- package/vendor/mcp-server/index.js.map +1 -1
package/dist/index.js
CHANGED
|
@@ -59187,7 +59187,7 @@ var init_adhdev_daemon = __esm({
|
|
|
59187
59187
|
init_version();
|
|
59188
59188
|
init_src();
|
|
59189
59189
|
init_runtime_defaults();
|
|
59190
|
-
pkgVersion = resolvePackageVersion({ injectedVersion: "0.9.
|
|
59190
|
+
pkgVersion = resolvePackageVersion({ injectedVersion: "0.9.61" });
|
|
59191
59191
|
AdhdevDaemon = class _AdhdevDaemon {
|
|
59192
59192
|
localHttpServer = null;
|
|
59193
59193
|
localWss = null;
|
package/package.json
CHANGED
|
@@ -161,10 +161,14 @@ var FORMAT_PROP = {
|
|
|
161
161
|
};
|
|
162
162
|
var LIST_SESSIONS_TOOL = {
|
|
163
163
|
name: "list_sessions",
|
|
164
|
-
description: "List all
|
|
164
|
+
description: "List all connected agent sessions. In cloud mode, fetches session state from each daemon (data is sourced from daemon WS status reports, up to 30s stale). Pass daemon_id to scope to a single daemon.",
|
|
165
165
|
inputSchema: {
|
|
166
166
|
type: "object",
|
|
167
167
|
properties: {
|
|
168
|
+
daemon_id: {
|
|
169
|
+
type: "string",
|
|
170
|
+
description: "Daemon ID (cloud mode only). Omit to list sessions across all daemons."
|
|
171
|
+
},
|
|
168
172
|
...FORMAT_PROP
|
|
169
173
|
},
|
|
170
174
|
required: []
|
|
@@ -187,46 +191,66 @@ async function listSessions(transport, args = {}) {
|
|
|
187
191
|
}, null, 2);
|
|
188
192
|
}
|
|
189
193
|
if (sessions.length === 0) return "No active sessions.";
|
|
190
|
-
const
|
|
194
|
+
const lines = sessions.map((s) => {
|
|
191
195
|
const parts = [`id: ${s.id}`, `type: ${s.providerType ?? s.type ?? "unknown"}`];
|
|
192
196
|
if (s.label) parts.push(`label: ${s.label}`);
|
|
193
|
-
if (s.agentStatus) parts.push(`status: ${s.agentStatus}`);
|
|
197
|
+
if (s.status ?? s.agentStatus) parts.push(`status: ${s.status ?? s.agentStatus}`);
|
|
194
198
|
if (s.workspace) parts.push(`workspace: ${s.workspace}`);
|
|
195
199
|
return parts.join(", ");
|
|
196
200
|
});
|
|
197
201
|
return `Sessions (${sessions.length}):
|
|
198
|
-
${
|
|
202
|
+
${lines.join("\n")}`;
|
|
199
203
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
id: s.id,
|
|
209
|
-
type: s.providerType ?? "unknown",
|
|
210
|
-
status: s.status ?? s.agentStatus ?? null,
|
|
211
|
-
workspace: s.workspace ?? null
|
|
212
|
-
});
|
|
213
|
-
}
|
|
204
|
+
return listSessionsCloud(transport, args.daemon_id, asJson);
|
|
205
|
+
}
|
|
206
|
+
async function listSessionsCloud(transport, daemonId, asJson) {
|
|
207
|
+
const collected = [];
|
|
208
|
+
if (daemonId) {
|
|
209
|
+
const daemonStatus = await transport.getDaemonStatus(daemonId);
|
|
210
|
+
for (const s of daemonStatus?.sessions ?? []) {
|
|
211
|
+
collected.push({ daemonId, session: s });
|
|
214
212
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
213
|
+
} else {
|
|
214
|
+
const data = await transport.listDaemons();
|
|
215
|
+
const daemons = data?.daemons ?? [];
|
|
216
|
+
for (let i = 0; i < daemons.length; i += 5) {
|
|
217
|
+
await Promise.allSettled(
|
|
218
|
+
daemons.slice(i, i + 5).map(async (d) => {
|
|
219
|
+
try {
|
|
220
|
+
const daemonStatus = await transport.getDaemonStatus(d.id);
|
|
221
|
+
for (const s of daemonStatus?.sessions ?? []) {
|
|
222
|
+
collected.push({ daemonId: d.id, session: s });
|
|
223
|
+
}
|
|
224
|
+
} catch {
|
|
225
|
+
}
|
|
226
|
+
})
|
|
224
227
|
);
|
|
225
228
|
}
|
|
226
|
-
if (sessions.length === 0) lines.push(`daemon: ${d.id} (no sessions)`);
|
|
227
229
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
+
if (asJson) {
|
|
231
|
+
return JSON.stringify({
|
|
232
|
+
sessions: collected.map(({ daemonId: dId, session: s }) => ({
|
|
233
|
+
daemon_id: dId,
|
|
234
|
+
id: s.id,
|
|
235
|
+
type: s.providerType ?? "unknown",
|
|
236
|
+
status: s.status ?? null,
|
|
237
|
+
workspace: s.workspace ?? null
|
|
238
|
+
}))
|
|
239
|
+
}, null, 2);
|
|
240
|
+
}
|
|
241
|
+
if (collected.length === 0) return "No active sessions.";
|
|
242
|
+
const lines = collected.map(({ daemonId: dId, session: s }) => {
|
|
243
|
+
const parts = [
|
|
244
|
+
`daemon: ${dId}`,
|
|
245
|
+
`session: ${s.id}`,
|
|
246
|
+
`type: ${s.providerType ?? "unknown"}`
|
|
247
|
+
];
|
|
248
|
+
if (s.status) parts.push(`status: ${s.status}`);
|
|
249
|
+
if (s.workspace) parts.push(`workspace: ${s.workspace}`);
|
|
250
|
+
return parts.join(", ");
|
|
251
|
+
});
|
|
252
|
+
return `Sessions (${collected.length}):
|
|
253
|
+
${lines.join("\n")}`;
|
|
230
254
|
}
|
|
231
255
|
|
|
232
256
|
// src/tools/read-chat.ts
|
|
@@ -380,17 +404,13 @@ async function approve(transport, args) {
|
|
|
380
404
|
// src/tools/screenshot.ts
|
|
381
405
|
var SCREENSHOT_TOOL = {
|
|
382
406
|
name: "screenshot",
|
|
383
|
-
description: "Capture a screenshot of the current IDE window. Returns the image.",
|
|
407
|
+
description: "Capture a screenshot of the current IDE window. Returns the image. Local mode only \u2014 screenshots require direct P2P access to the daemon and are not available in cloud mode.",
|
|
384
408
|
inputSchema: {
|
|
385
409
|
type: "object",
|
|
386
410
|
properties: {
|
|
387
411
|
session_id: {
|
|
388
412
|
type: "string",
|
|
389
413
|
description: "Target session ID. Omit to use the active session."
|
|
390
|
-
},
|
|
391
|
-
daemon_id: {
|
|
392
|
-
type: "string",
|
|
393
|
-
description: "Daemon ID (cloud mode only)."
|
|
394
414
|
}
|
|
395
415
|
},
|
|
396
416
|
required: []
|
|
@@ -705,7 +725,7 @@ async function startMcpServer(opts) {
|
|
|
705
725
|
...isLocal ? [SCREENSHOT_TOOL] : []
|
|
706
726
|
];
|
|
707
727
|
const server = new import_server.Server(
|
|
708
|
-
{ name: "adhdev-mcp-server", version: "0.9.
|
|
728
|
+
{ name: "adhdev-mcp-server", version: "0.9.61" },
|
|
709
729
|
{ capabilities: { tools: {} } }
|
|
710
730
|
);
|
|
711
731
|
server.setRequestHandler(import_types.ListToolsRequestSchema, async () => ({ tools: allTools }));
|
|
@@ -715,7 +735,7 @@ async function startMcpServer(opts) {
|
|
|
715
735
|
try {
|
|
716
736
|
switch (name) {
|
|
717
737
|
case "list_sessions": {
|
|
718
|
-
const text = await listSessions(transport, { format: a.format });
|
|
738
|
+
const text = await listSessions(transport, { format: a.format, daemon_id: a.daemon_id });
|
|
719
739
|
return { content: [{ type: "text", text }] };
|
|
720
740
|
}
|
|
721
741
|
case "read_chat": {
|
|
@@ -732,7 +752,7 @@ async function startMcpServer(opts) {
|
|
|
732
752
|
return { content: [{ type: "text", text }] };
|
|
733
753
|
}
|
|
734
754
|
case "screenshot": {
|
|
735
|
-
const result = await screenshot(transport, { session_id: a.session_id
|
|
755
|
+
const result = await screenshot(transport, { session_id: a.session_id });
|
|
736
756
|
if (result.type === "image") {
|
|
737
757
|
return {
|
|
738
758
|
content: [{ type: "image", data: result.data, mimeType: result.mimeType }]
|
|
@@ -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.60' },\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 });\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, daemon_id: a.daemon_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: 'List all currently connected IDE and CLI agent sessions on the local machine.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n ...FORMAT_PROP,\n },\n required: [],\n },\n};\n\nexport async function listSessions(\n transport: LocalTransport | CloudTransport,\n args: { format?: 'text' | 'json' } = {},\n): Promise<string> {\n const asJson = args.format === 'json';\n\n if ('getStatus' in transport) {\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.agentStatus) parts.push(`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 // CloudTransport\n const data = await (transport as CloudTransport).listDaemons();\n const daemons: any[] = data?.daemons ?? data ?? [];\n\n if (asJson) {\n const sessions: any[] = [];\n for (const d of daemons) {\n for (const s of d.sessions ?? []) {\n sessions.push({\n daemon_id: d.id,\n id: s.id,\n type: s.providerType ?? 'unknown',\n status: s.status ?? s.agentStatus ?? null,\n workspace: s.workspace ?? null,\n });\n }\n }\n return JSON.stringify({ sessions }, null, 2);\n }\n\n if (daemons.length === 0) return 'No connected daemons.';\n const lines: string[] = [];\n for (const d of daemons) {\n const sessions: any[] = d.sessions ?? [];\n for (const s of sessions) {\n lines.push(\n `daemon: ${d.id}, session: ${s.id}, type: ${s.providerType ?? 'unknown'}${s.agentStatus ? `, status: ${s.agentStatus}` : ''}`,\n );\n }\n if (sessions.length === 0) lines.push(`daemon: ${d.id} (no sessions)`);\n }\n return lines.length > 0 ? `Sessions:\\n${lines.join('\\n')}` : 'No active sessions.';\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: 'Capture a screenshot of the current IDE window. Returns the image.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n session_id: {\n type: 'string',\n description: 'Target session ID. Omit to use the active session.',\n },\n daemon_id: {\n type: 'string',\n description: 'Daemon ID (cloud mode only).',\n },\n },\n required: [],\n },\n};\n\nexport async function screenshot(\n transport: LocalTransport | CloudTransport,\n args: { session_id?: string; daemon_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":["lines","result","result","result","result","id"]}
|
|
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"]}
|