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:
parent
9688454a30
commit
047adb8c58
@ -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();
|
||||||
|
|||||||
@ -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()),
|
{
|
||||||
model: Type.Optional(Type.String()),
|
sessionKey: 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(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user