diff --git a/package.json b/package.json index c8f0d79f3..1b23f31cc 100644 --- a/package.json +++ b/package.json @@ -252,11 +252,7 @@ "@sinclair/typebox": "0.34.47", "hono": "4.11.4", "tar": "7.5.4" - }, - "ignoredBuiltDependencies": [ - "core-js", - "node-llama-cpp" - ] + } }, "vitest": { "coverage": { diff --git a/src/agents/claude-agent-sdk/sdk-runner.ts b/src/agents/claude-agent-sdk/sdk-runner.ts index 8121839e3..5750b76d0 100644 --- a/src/agents/claude-agent-sdk/sdk-runner.ts +++ b/src/agents/claude-agent-sdk/sdk-runner.ts @@ -930,15 +930,6 @@ export async function runSdkAgent(params: SdkRunnerParams): Promise }; + +/** + * Handle tool events from onAgentEvent callback. + * Call this from onAgentEvent handlers to get consistent tool logging. + */ +export function logToolEvent(evt: AgentEventData, runId?: string): void { + if (evt.stream !== "tool") return; + + const phase = evt.data.phase as string | undefined; + const toolName = String(evt.data.name ?? "unknown"); + const toolCallId = String(evt.data.toolCallId ?? ""); + + switch (phase) { + case "start": + log.debug(`tool start: ${toolName}`, { + runId, + toolCallId, + args: evt.data.args, + }); + break; + case "result": { + const isError = Boolean(evt.data.isError); + if (isError) { + const result = evt.data.result ?? evt.data.resultText; + const errorPreview = + typeof result === "string" ? result.slice(0, 500) : String(result).slice(0, 500); + log.warn(`tool failed: ${toolName}`, { + runId, + toolCallId, + error: errorPreview, + }); + } else { + log.debug(`tool complete: ${toolName}`, { runId, toolCallId }); + } + break; + } + } +} diff --git a/src/agents/unified-agent-runner.ts b/src/agents/unified-agent-runner.ts index 2bdd41041..8ab1f4c48 100644 --- a/src/agents/unified-agent-runner.ts +++ b/src/agents/unified-agent-runner.ts @@ -336,7 +336,7 @@ export async function runAgentWithUnifiedFailover( : { enforceFinalTag: effectiveEnforceFinalTag }, }); - log.debug("Agent run completed", { + log.info("Agent run completed", { sessionId: params.sessionId, runId: params.runId, runtime: runtimeKind, diff --git a/src/auto-reply/reply/agent-runner-execution.ts b/src/auto-reply/reply/agent-runner-execution.ts index 629d1bdb1..1d9172d69 100644 --- a/src/auto-reply/reply/agent-runner-execution.ts +++ b/src/auto-reply/reply/agent-runner-execution.ts @@ -5,6 +5,7 @@ import { runCliAgent } from "../../agents/cli-runner.js"; import { getCliSessionId } from "../../agents/cli-session.js"; import { isCliProvider } from "../../agents/model-selection.js"; import { runEmbeddedPiAgent } from "../../agents/pi-embedded.js"; +import { logToolEvent } from "../../agents/tool-event-logger.js"; import { runAgentWithUnifiedFailover } from "../../agents/unified-agent-runner.js"; import { isCompactionFailureError, @@ -362,6 +363,8 @@ export async function runAgentTurnWithFallback(params: { } : undefined, onAgentEvent: async (evt) => { + // Log tool events centrally. + logToolEvent(evt, runId); // Trigger typing when tools start executing. if (evt.stream === "tool") { const phase = typeof evt.data.phase === "string" ? evt.data.phase : ""; diff --git a/src/commands/agent.ts b/src/commands/agent.ts index fc0969f13..648491e42 100644 --- a/src/commands/agent.ts +++ b/src/commands/agent.ts @@ -18,6 +18,7 @@ import { resolveThinkingDefault, } from "../agents/model-selection.js"; import { runEmbeddedPiAgent } from "../agents/pi-embedded.js"; +import { logToolEvent } from "../agents/tool-event-logger.js"; import { runAgentWithUnifiedFailover, type UnifiedAgentRunResult, @@ -456,6 +457,8 @@ export async function agentCommand( // Callbacks onAgentEvent: (evt) => { + // Log tool events centrally. + logToolEvent(evt, runId); // Track lifecycle end for fallback emission below. if ( evt.stream === "lifecycle" &&