From 55606eddc8d7411a393468e416eefb1e456b90e2 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Wed, 29 Jul 2026 21:21:28 +0200 Subject: [PATCH] diag(mcp): Client-Capabilities beim Binden festhalten MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Push-Test mit den echten CLIs war NEGATIV: codex meldete "durch agenthub_work erfahren", kimi ausdruecklich "kein MCP-Push". Der Kanal funktioniert (mit eigenem Testclient verifiziert), die Hosts reichen ihn aber offenbar nicht ans Modell durch. Naheliegender Verdacht, statt zu spekulieren gemessen: `sendLoggingMessage` nuetzt nichts, wenn der CLIENT `logging` nicht deklariert — dann verwirft seine SDK-Seite die Notification, bevor das Modell sie je sieht. Mein Testclient deklarierte sie ausdruecklich und empfing deshalb. Die Bridge schreibt die deklarierten Client-Capabilities jetzt nach ~/.cache/agenthub/client-capabilities-.json. Co-Authored-By: Claude Opus 5 (1M context) --- src/mcp/pushChannel.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/mcp/pushChannel.ts b/src/mcp/pushChannel.ts index 0349b95..4bbe910 100644 --- a/src/mcp/pushChannel.ts +++ b/src/mcp/pushChannel.ts @@ -1,4 +1,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { writeFileSync, mkdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { homedir } from 'node:os'; import { parseSSEBuffer } from '../cli/commands/watch.js'; import { remoteClient } from '../cli/remoteClient.js'; @@ -79,6 +82,21 @@ export function bindPushChannel(server: McpServer, serverUrl: string, agent: str const state: PushState = { agent: name, names: new Set([name]), stop: () => { stopped = true; } }; active = state; + // DIAGNOSE: Was deklariert der CLI-Host ueberhaupt? `sendLoggingMessage` + // nuetzt nichts, wenn der Client `logging` nicht deklariert — dann verwirft + // seine SDK-Seite die Notification, bevor das Modell sie je sieht. Genau das + // ist der Verdacht, nachdem codex und kimi den Push nicht wahrgenommen haben. + // Wir schreiben es weg, statt zu spekulieren. + try { + const caps = server.server.getClientCapabilities(); + const dir = join(homedir(), '.cache', 'agenthub'); + mkdirSync(dir, { recursive: true }); + writeFileSync( + join(dir, `client-capabilities-${name}.json`), + JSON.stringify({ agent: name, at: new Date().toISOString(), capabilities: caps ?? null }, null, 2), + ); + } catch { /* Diagnose darf den Kanal nie blockieren */ } + void (async () => { // Aliase mitnehmen, damit ein umbenannter Agent seine Events weiter bekommt. try {