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
This commit is contained in:
lewiscutey 2026-01-28 17:14:06 +08:00
parent 9688454a30
commit 047adb8c58
2 changed files with 36 additions and 8 deletions

View File

@ -104,6 +104,30 @@ describe("session_status tool", () => {
expect(details.statusText).not.toContain("OAuth/token status"); 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<string, unknown>);
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 () => { it("errors for unknown session keys", async () => {
loadSessionStoreMock.mockReset(); loadSessionStoreMock.mockReset();
updateSessionStoreMock.mockReset(); updateSessionStoreMock.mockReset();

View File

@ -48,10 +48,13 @@ import {
} from "./sessions-helpers.js"; } from "./sessions-helpers.js";
import { loadCombinedSessionStoreForGateway } from "../../gateway/session-utils.js"; import { loadCombinedSessionStoreForGateway } from "../../gateway/session-utils.js";
const SessionStatusToolSchema = Type.Object({ const SessionStatusToolSchema = Type.Object(
{
sessionKey: Type.Optional(Type.String()), sessionKey: Type.Optional(Type.String()),
model: Type.Optional(Type.String()), model: Type.Optional(Type.String()),
}); },
{ additionalProperties: false },
);
function formatApiKeySnippet(apiKey: string): string { function formatApiKeySnippet(apiKey: string): string {
const compact = apiKey.replace(/\s+/g, ""); 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).", "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, parameters: SessionStatusToolSchema,
execute: async (_toolCallId, args) => { execute: async (_toolCallId, args) => {
const params = args as Record<string, unknown>; const params = (args ?? {}) as Record<string, unknown>;
const cfg = opts?.config ?? loadConfig(); const cfg = opts?.config ?? loadConfig();
const { mainKey, alias } = resolveMainSessionAlias(cfg); const { mainKey, alias } = resolveMainSessionAlias(cfg);
const a2aPolicy = createAgentToAgentPolicy(cfg); const a2aPolicy = createAgentToAgentPolicy(cfg);
const requestedKeyParam = readStringParam(params, "sessionKey"); const requestedKeyParam = readStringParam(params, "sessionKey");
let requestedKeyRaw = requestedKeyParam ?? opts?.agentSessionKey; let requestedKeyRaw = requestedKeyParam ?? opts?.agentSessionKey ?? "";
if (!requestedKeyRaw?.trim()) { if (!requestedKeyRaw.trim()) {
throw new Error("sessionKey required"); // Default to current session if no key provided
requestedKeyRaw = opts?.agentSessionKey ?? mainKey;
} }
const requesterAgentId = resolveAgentIdFromSessionKey( const requesterAgentId = resolveAgentIdFromSessionKey(