From 047adb8c58a5f6778ce7221f41190a4dd34c8d0f Mon Sep 17 00:00:00 2001 From: lewiscutey <949124363@qq.com> Date: Wed, 28 Jan 2026 17:14:06 +0800 Subject: [PATCH] Fix session_status tool validation when called with no arguments (#3226) - Allow undefined args by defaulting to empty object - Default to current session when sessionKey is not provided - Update schema to explicitly allow empty object with additionalProperties: false - Add test case for undefined args scenario Fixes #3226 --- .../clawdbot-tools.session-status.test.ts | 24 +++++++++++++++++++ src/agents/tools/session-status-tool.ts | 20 +++++++++------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/agents/clawdbot-tools.session-status.test.ts b/src/agents/clawdbot-tools.session-status.test.ts index 8febbd16b..fc907acc2 100644 --- a/src/agents/clawdbot-tools.session-status.test.ts +++ b/src/agents/clawdbot-tools.session-status.test.ts @@ -104,6 +104,30 @@ describe("session_status tool", () => { expect(details.statusText).not.toContain("OAuth/token status"); }); + it("accepts undefined args and defaults to current session", async () => { + loadSessionStoreMock.mockReset(); + updateSessionStoreMock.mockReset(); + loadSessionStoreMock.mockReturnValue({ + main: { + sessionId: "s1", + updatedAt: 10, + }, + }); + + const tool = createMoltbotTools({ agentSessionKey: "main" }).find( + (candidate) => candidate.name === "session_status", + ); + expect(tool).toBeDefined(); + if (!tool) throw new Error("missing session_status tool"); + + // Test with undefined args (the issue scenario) + const result = await tool.execute("call1b", undefined as unknown as Record); + const details = result.details as { ok?: boolean; statusText?: string }; + expect(details.ok).toBe(true); + expect(details.statusText).toContain("Moltbot"); + expect(details.statusText).toContain("🧠 Model:"); + }); + it("errors for unknown session keys", async () => { loadSessionStoreMock.mockReset(); updateSessionStoreMock.mockReset(); diff --git a/src/agents/tools/session-status-tool.ts b/src/agents/tools/session-status-tool.ts index 4d47da4d7..d0fcb3493 100644 --- a/src/agents/tools/session-status-tool.ts +++ b/src/agents/tools/session-status-tool.ts @@ -48,10 +48,13 @@ import { } from "./sessions-helpers.js"; import { loadCombinedSessionStoreForGateway } from "../../gateway/session-utils.js"; -const SessionStatusToolSchema = Type.Object({ - sessionKey: Type.Optional(Type.String()), - model: Type.Optional(Type.String()), -}); +const SessionStatusToolSchema = Type.Object( + { + sessionKey: Type.Optional(Type.String()), + model: Type.Optional(Type.String()), + }, + { additionalProperties: false }, +); function formatApiKeySnippet(apiKey: string): string { const compact = apiKey.replace(/\s+/g, ""); @@ -241,15 +244,16 @@ export function createSessionStatusTool(opts?: { "Show a /status-equivalent session status card (usage + time + cost when available). Use for model-use questions (📊 session_status). Optional: set per-session model override (model=default resets overrides).", parameters: SessionStatusToolSchema, execute: async (_toolCallId, args) => { - const params = args as Record; + const params = (args ?? {}) as Record; const cfg = opts?.config ?? loadConfig(); const { mainKey, alias } = resolveMainSessionAlias(cfg); const a2aPolicy = createAgentToAgentPolicy(cfg); const requestedKeyParam = readStringParam(params, "sessionKey"); - let requestedKeyRaw = requestedKeyParam ?? opts?.agentSessionKey; - if (!requestedKeyRaw?.trim()) { - throw new Error("sessionKey required"); + let requestedKeyRaw = requestedKeyParam ?? opts?.agentSessionKey ?? ""; + if (!requestedKeyRaw.trim()) { + // Default to current session if no key provided + requestedKeyRaw = opts?.agentSessionKey ?? mainKey; } const requesterAgentId = resolveAgentIdFromSessionKey(