From c9144789fd8bc3d629b68cbc7a00a18a57179dab Mon Sep 17 00:00:00 2001 From: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 01:58:22 +0000 Subject: [PATCH] fix(agents): do not refresh lastUsedAt on MCP lease release --- src/agents/agent-bundle-mcp-runtime.test.ts | 11 +++++++---- src/agents/agent-bundle-mcp-runtime.ts | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/agents/agent-bundle-mcp-runtime.test.ts b/src/agents/agent-bundle-mcp-runtime.test.ts index b9d89c10b19..b035a36f8f4 100644 --- a/src/agents/agent-bundle-mcp-runtime.test.ts +++ b/src/agents/agent-bundle-mcp-runtime.test.ts @@ -7,12 +7,12 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { createBundleMcpJsonSchemaValidator } from "./agent-bundle-mcp-runtime.js"; import { cleanupBundleMcpHarness } from "./agent-bundle-mcp-test-harness.js"; import { - testing, createSessionMcpRuntime, getOrCreateSessionMcpRuntime, materializeBundleMcpToolsForRun, retireSessionMcpRuntime, retireSessionMcpRuntimeForSessionKey, + testing, } from "./agent-bundle-mcp-tools.js"; import type { SessionMcpRuntime } from "./agent-bundle-mcp-types.js"; import { writeExecutable } from "./bundle-mcp-shared.test-harness.js"; @@ -1672,12 +1672,12 @@ process.on("SIGINT", shutdown);`, }); const releaseLease = runtime.acquireLease?.(); - // TTL elapses while the lease is still held — sweep skips active runtimes + // TTL elapses while the lease is still held, so sweep skips active runtimes. now += 60; await expect(manager.sweepIdleRuntimes()).resolves.toBe(0); - // Release the lease — must not reset lastUsedAt, so the runtime is - // evictable on the very next sweep without waiting another full TTL + // Release must not reset lastUsedAt; the runtime is evictable on the very + // next sweep without waiting another full TTL. releaseLease?.(); await expect(manager.sweepIdleRuntimes()).resolves.toBe(1); @@ -1722,6 +1722,9 @@ process.on("SIGINT", shutdown);`, cfg: { mcp: { servers: {} } }, }); const lastUsedBefore = runtime.lastUsedAt; + if (!runtime.acquireLease) { + throw new Error("Expected production session MCP runtime to expose acquireLease"); + } const release = runtime.acquireLease(); release(); expect(runtime.lastUsedAt).toBe(lastUsedBefore); diff --git a/src/agents/agent-bundle-mcp-runtime.ts b/src/agents/agent-bundle-mcp-runtime.ts index 5e6c15b87fc..771552a4fa2 100644 --- a/src/agents/agent-bundle-mcp-runtime.ts +++ b/src/agents/agent-bundle-mcp-runtime.ts @@ -765,7 +765,7 @@ export function createSessionMcpRuntime(params: { } released = true; activeLeases = Math.max(0, activeLeases - 1); - // release ≠ use: refreshing lastUsedAt here defeats the idle-sweep TTL. + // Release is not use: refreshing lastUsedAt here defeats the idle-sweep TTL. }; }, getCatalog,