From 917dddb27b8eac057e41e3564fc2f66b7700f98c Mon Sep 17 00:00:00 2001 From: SK Akram Date: Sun, 15 Feb 2026 12:52:34 +0000 Subject: [PATCH] fix: address code review - nested object hashing and error logging --- src/agents/tool-loop-detection.ts | 17 +++++++++++++---- src/logging/diagnostic.ts | 4 +++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/agents/tool-loop-detection.ts b/src/agents/tool-loop-detection.ts index 32cccb983c0..7a39a53437a 100644 --- a/src/agents/tool-loop-detection.ts +++ b/src/agents/tool-loop-detection.ts @@ -17,16 +17,25 @@ export const CRITICAL_THRESHOLD = 20; */ export function hashToolCall(toolName: string, params: unknown): string { try { - const paramsStr = - typeof params === "object" && params !== null - ? JSON.stringify(params, Object.keys(params).toSorted()) - : String(params); + const paramsStr = stableStringify(params); return `${toolName}:${paramsStr}`; } catch { return `${toolName}:${String(params)}`; } } +function stableStringify(value: unknown): string { + if (value === null || typeof value !== "object") { + return JSON.stringify(value); + } + if (Array.isArray(value)) { + return `[${value.map(stableStringify).join(",")}]`; + } + const obj = value as Record; + const keys = Object.keys(obj).toSorted(); + return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(",")}}`; +} + /** * Detect if an agent is stuck in a repetitive tool call loop. * Checks if the same tool+params combination has been called excessively. diff --git a/src/logging/diagnostic.ts b/src/logging/diagnostic.ts index e8c0dc2ca1e..8ecdc4abd66 100644 --- a/src/logging/diagnostic.ts +++ b/src/logging/diagnostic.ts @@ -320,7 +320,9 @@ export function startDiagnosticHeartbeat() { pruneStaleCommandPolls(state); } }) - .catch(() => {}); + .catch((err) => { + diag.debug(`command-poll-backoff prune failed: ${String(err)}`); + }); for (const [, state] of diagnosticSessionStates) { const ageMs = now - state.lastActivity;