From 4a503ecf4c9e1c855f54776e4ef256b9ce67ba45 Mon Sep 17 00:00:00 2001 From: Naiyuan Qing <145280634+NevilleQingNY@users.noreply.github.com> Date: Fri, 6 Feb 2026 19:35:32 +0800 Subject: [PATCH] feat(agent): add AgentErrorEvent for error propagation via subscribe Add agent_error event type to MulticaEvent union so errors from agent runs reach subscribe() consumers (Desktop IPC + Channel). Make emitMulticaEvent public on Runner so AsyncAgent can emit errors. Co-Authored-By: Claude Opus 4.6 --- src/agent/async-agent.ts | 4 ++++ src/agent/events.ts | 8 +++++++- src/agent/runner.ts | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/agent/async-agent.ts b/src/agent/async-agent.ts index db22b843..910e2742 100644 --- a/src/agent/async-agent.ts +++ b/src/agent/async-agent.ts @@ -48,12 +48,16 @@ export class AsyncAgent { await this.agent.flushSession(); // Normal text is delivered via message_end event; only handle errors here if (result.error) { + console.error(`[AsyncAgent] Agent run error: ${result.error}`); this.channel.send({ id: uuidv7(), content: `[error] ${result.error}` }); + this.agent.emitMulticaEvent({ type: "agent_error", error: result.error }); } }) .catch((err) => { const message = err instanceof Error ? err.message : String(err); + console.error(`[AsyncAgent] Agent run exception: ${message}`); this.channel.send({ id: uuidv7(), content: `[error] ${message}` }); + this.agent.emitMulticaEvent({ type: "agent_error", error: message }); }); } diff --git a/src/agent/events.ts b/src/agent/events.ts index 8eb8b422..de46f02a 100644 --- a/src/agent/events.ts +++ b/src/agent/events.ts @@ -26,5 +26,11 @@ export type CompactionEndEvent = { reason: "count" | "tokens" | "summary" | "pruning"; }; +/** Emitted when the agent encounters an error (LLM failure, quota exceeded, etc.) */ +export type AgentErrorEvent = { + type: "agent_error"; + error: string; +}; + /** Union of all Multica-specific events */ -export type MulticaEvent = CompactionStartEvent | CompactionEndEvent; +export type MulticaEvent = CompactionStartEvent | CompactionEndEvent | AgentErrorEvent; diff --git a/src/agent/runner.ts b/src/agent/runner.ts index 65fd528b..479cd473 100644 --- a/src/agent/runner.ts +++ b/src/agent/runner.ts @@ -342,7 +342,7 @@ export class Agent { }; } - private emitMulticaEvent(event: MulticaEvent): void { + emitMulticaEvent(event: MulticaEvent): void { for (const fn of this.multicaListeners) { try { fn(event);