feat(mcp): Push-Kanal beim Bridge-Start binden (agenthub mcp --agent <name>)

Bisher band die Bridge den Push-Kanal erst, wenn der Agent seinen Namen nannte
(hello/work). Genau davor — direkt nach dem Session-Start — war er also
weiterhin taub, und das ist der Zustand, den wir beheben wollen. Mit
`--agent <name>` bindet die Bridge ab der ersten Sekunde.

Codex- und Kimi-Konfiguration entsprechend gesetzt (args ["mcp","--agent",…]).

Briefing umgeschrieben: Es sagte "du bist waehrend der Arbeit taub" — das
stimmt nicht mehr. Jetzt: Push-Benachrichtigungen sind verbindlich, sofort
darauf reagieren; der pending-Block im task_log-Ergebnis bleibt als zweiter
Empfangsweg, Loggen bleibt Pflicht.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
chahinebrini 2026-07-29 21:13:07 +02:00
parent e8c2e43cb0
commit dbaf29a6c6
3 changed files with 19 additions and 7 deletions

View File

@ -38,10 +38,16 @@ export function agentBriefing(agent: string, role: string): string {
'2. Deine Aufgabe steht IMMER im Handoff des Tasks. Lies ihn, bevor du baust.',
`3. Logge nach jedem Teilschritt: agenthub_task_log(id, text, agent="${agent}").`,
'',
'WÄHREND DER ARBEIT BIST DU TAUB — das ist der wichtigste Punkt:',
'Solange du einen Task ausführst, erreichen dich KEINE Events. Der einzige',
'Draht nach außen ist die ANTWORT von agenthub_task_log. Deshalb ist Loggen',
'keine Höflichkeit, sondern dein Empfang.',
'DU WIRST GEPUSHT — auch ohne laufenden Tool-Call:',
'Die AgentHub-Bridge schickt dir MCP-Benachrichtigungen, sobald etwas für',
'dich anliegt: neue oder zurückgegebene Task, Nachricht, beantwortete Frage,',
'Abbruch. Diese Meldungen sind VERBINDLICH — reagiere sofort darauf, statt',
'zu warten. Steht dort ein Abbruch oder eine Rückgabe: aufhören, nicht',
'einreichen.',
'',
'ZUSÄTZLICH (Netz, kein Ersatz): die ANTWORT von agenthub_task_log trägt',
'einen `pending`-Block, wenn etwas offen ist. Loggen bleibt Pflicht — es ist',
'dein zweiter Empfangsweg und macht deinen Fortschritt sichtbar.',
'',
' - Enthält die Antwort `pending.interrupted`, wurde dir der Task',
' zurückgegeben, abgebrochen oder entzogen: SOFORT aufhören, NICHT',

View File

@ -838,12 +838,13 @@ export function createProgram(cwd: string): Command {
.command('mcp [action]')
.description('Start the MCP server (stdio). `agenthub mcp install` writes .mcp.json so MCP-aware agents auto-register.')
.option('--print', 'Dry run: print the config instead of writing .mcp.json')
.action(async (action: string | undefined, options: { print?: boolean }) => {
.option('--agent <name>', 'Bind the MCP push channel to this agent at startup (recommended: the bridge then pushes from the first second, without waiting for a tool call)')
.action(async (action: string | undefined, options: { print?: boolean; agent?: string }) => {
if (action === 'install') {
installMcp(cwd, { print: options.print });
return;
}
await startMcpServer(cwd);
await startMcpServer(cwd, { agent: options.agent });
});
// ─── hello (presence) ──────────────────────────────────────────────────────

View File

@ -198,7 +198,7 @@ export function waitForTask<T>(
});
}
export async function startMcpServer(cwd: string): Promise<void> {
export async function startMcpServer(cwd: string, options: { agent?: string } = {}): Promise<void> {
const { root, serverUrl } = await resolveMcpContext(cwd);
const remote = !!serverUrl;
// `logging` MUSS deklariert werden: sendLoggingMessage prueft
@ -213,6 +213,11 @@ export async function startMcpServer(cwd: string): Promise<void> {
const bindPush = (agent?: string) => {
if (remote && agent) bindPushChannel(server, serverUrl!, agent);
};
// Beim Start binden, wenn der Name bekannt ist (`agenthub mcp --agent codex`).
// Ohne das beginnt der Push erst mit dem ersten Tool-Aufruf — und genau in
// dem Fenster davor ist der Agent wieder taub, also fuer den Zustand, den
// wir beheben wollen.
bindPush(options.agent);
server.tool('agenthub_hello', 'Announce yourself to the hub (presence). Run once when you start.',
{ agent: z.string(), role: z.string().optional() },