From c1655dd318b54c0acde8b57e4770718f1d70934d Mon Sep 17 00:00:00 2001 From: Ajax Davis Date: Thu, 15 Jan 2026 00:59:05 +1000 Subject: [PATCH] fix: pass explicit version to executor to avoid Deno cache issues The executor was using version: 'latest' which caused Deno to cache old versions of packages. Now we pass the explicit version from the database to ensure the correct version is always loaded. Also fixed sprites-list to recognize 'cold' as a valid sprite status. --- apps/web/src/lib/ai-agent/tool-executor-agent.ts | 2 ++ apps/web/src/lib/executors/index.ts | 1 + apps/web/src/lib/mcp/handlers.ts | 5 ++++- packages/package-executor/src/executor.ts | 3 ++- packages/package-executor/src/types.ts | 2 ++ packages/tools/official/sprites-list/src/index.ts | 5 +++-- 6 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/web/src/lib/ai-agent/tool-executor-agent.ts b/apps/web/src/lib/ai-agent/tool-executor-agent.ts index d002151..b308199 100644 --- a/apps/web/src/lib/ai-agent/tool-executor-agent.ts +++ b/apps/web/src/lib/ai-agent/tool-executor-agent.ts @@ -136,9 +136,11 @@ export function createToolDefinition( // Execute the actual npm package using resolved executor // Use the actual export name from the Tool record + // Pass explicit version to avoid Deno HTTP import cache issues with @latest const result = await executeWithExecutor(executorConfig ?? null, { packageName: tool.package.npmPackageName, name: tool.name, // Use actual export name (e.g., "helloWorldTool", "default") + version: tool.package.npmVersion, params, env: envVars && Object.keys(envVars).length > 0 ? envVars : undefined, }); diff --git a/apps/web/src/lib/executors/index.ts b/apps/web/src/lib/executors/index.ts index 76f9101..998b24e 100644 --- a/apps/web/src/lib/executors/index.ts +++ b/apps/web/src/lib/executors/index.ts @@ -164,6 +164,7 @@ export async function executeWithExecutor( // Default: use existing package-executor (which uses SANDBOX_EXECUTOR_URL) const result = await executePackage(request.packageName, request.name, request.params, { env: request.env, + version: request.version, }); return { diff --git a/apps/web/src/lib/mcp/handlers.ts b/apps/web/src/lib/mcp/handlers.ts index 3aa6d00..6b057ac 100644 --- a/apps/web/src/lib/mcp/handlers.ts +++ b/apps/web/src/lib/mcp/handlers.ts @@ -195,8 +195,9 @@ export async function handleToolsCall( }; } - // Get the actual package name that matched + // Get the actual package name and version that matched const actualPackageName = collectionTool.tool.package.npmPackageName; + const actualVersion = collectionTool.tool.package.npmVersion; // Resolve executor configuration (collection config only for MCP - no agent context) const executorConfig = parseExecutorConfig( @@ -205,9 +206,11 @@ export async function handleToolsCall( ); // Execute via resolved executor with collection's environment variables + // Pass explicit version to avoid Deno HTTP import cache issues with @latest const result = await executeWithExecutor(executorConfig, { packageName: actualPackageName, name: parsed.toolName, + version: actualVersion, params: params.arguments ?? {}, env: (collection?.envVars as Record) ?? undefined, }); diff --git a/packages/package-executor/src/executor.ts b/packages/package-executor/src/executor.ts index c5fe85c..485358d 100644 --- a/packages/package-executor/src/executor.ts +++ b/packages/package-executor/src/executor.ts @@ -35,10 +35,11 @@ export async function executePackage( const timeoutId = setTimeout(() => controller.abort(), timeout); // Build request body, only include env if provided + // Use explicit version if provided to avoid Deno HTTP import cache issues const requestBody: Record = { packageName, name: functionName, - version: 'latest', + version: options.version || 'latest', params, }; if (options.env && Object.keys(options.env).length > 0) { diff --git a/packages/package-executor/src/types.ts b/packages/package-executor/src/types.ts index 0e68ccf..4a237ed 100644 --- a/packages/package-executor/src/types.ts +++ b/packages/package-executor/src/types.ts @@ -20,4 +20,6 @@ export interface ExecutorOptions { cacheDir?: string; /** Environment variables to inject during execution */ env?: Record; + /** Specific version to use (defaults to 'latest') */ + version?: string; } diff --git a/packages/tools/official/sprites-list/src/index.ts b/packages/tools/official/sprites-list/src/index.ts index 327f8d3..fcc9bc5 100644 --- a/packages/tools/official/sprites-list/src/index.ts +++ b/packages/tools/official/sprites-list/src/index.ts @@ -11,7 +11,7 @@ const SPRITES_API_BASE = 'https://api.sprites.dev/v1'; export interface Sprite { name: string; - status: 'creating' | 'running' | 'stopped' | 'error'; + status: 'creating' | 'running' | 'stopped' | 'error' | 'cold'; createdAt: string; runtime?: string; metadata?: Record; @@ -95,7 +95,8 @@ export const spritesListTool = tool({ const status = sprite.status as string | undefined; // Validate status is a known value - if (status && !['creating', 'running', 'stopped', 'error'].includes(status)) { + // Note: "cold" is returned for sprites that have been idle + if (status && !['creating', 'running', 'stopped', 'error', 'cold'].includes(status)) { throw new Error(`Invalid sprite status: ${status}`); }