@inkeep/agents-run-api 0.39.2 → 0.39.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/SandboxExecutorFactory.cjs +895 -0
  2. package/dist/SandboxExecutorFactory.js +893 -0
  3. package/dist/SandboxExecutorFactory.js.map +1 -0
  4. package/dist/chunk-VBDAOXYI.cjs +927 -0
  5. package/dist/chunk-VBDAOXYI.js +832 -0
  6. package/dist/chunk-VBDAOXYI.js.map +1 -0
  7. package/dist/chunk.cjs +34 -0
  8. package/dist/conversations.cjs +7 -0
  9. package/dist/conversations.js +7 -0
  10. package/dist/conversations2.cjs +209 -0
  11. package/dist/conversations2.js +180 -0
  12. package/dist/conversations2.js.map +1 -0
  13. package/dist/dbClient.cjs +9676 -0
  14. package/dist/dbClient.js +9670 -0
  15. package/dist/dbClient.js.map +1 -0
  16. package/dist/dbClient2.cjs +5 -0
  17. package/dist/dbClient2.js +5 -0
  18. package/dist/env.cjs +59 -0
  19. package/dist/env.js +54 -0
  20. package/dist/env.js.map +1 -0
  21. package/dist/execution-limits.cjs +260 -0
  22. package/dist/execution-limits.js +63 -0
  23. package/dist/execution-limits.js.map +1 -0
  24. package/dist/index.cjs +10548 -20592
  25. package/dist/index.d.cts +26 -22
  26. package/dist/index.d.cts.map +1 -0
  27. package/dist/index.d.ts +27 -22
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +10548 -12917
  30. package/dist/index.js.map +1 -0
  31. package/dist/instrumentation.cjs +12 -121
  32. package/dist/instrumentation.d.cts +9 -7
  33. package/dist/instrumentation.d.cts.map +1 -0
  34. package/dist/instrumentation.d.ts +9 -7
  35. package/dist/instrumentation.d.ts.map +1 -0
  36. package/dist/instrumentation.js +5 -1
  37. package/dist/instrumentation2.cjs +116 -0
  38. package/dist/instrumentation2.js +69 -0
  39. package/dist/instrumentation2.js.map +1 -0
  40. package/dist/json-postprocessor.cjs +20 -0
  41. package/dist/json-postprocessor.js +20 -0
  42. package/dist/json-postprocessor.js.map +1 -0
  43. package/dist/logger.cjs +5 -0
  44. package/dist/logger.js +3 -0
  45. package/dist/logger2.cjs +1 -0
  46. package/dist/logger2.js +3 -0
  47. package/dist/nodefs.cjs +29 -0
  48. package/dist/nodefs.js +27 -0
  49. package/dist/nodefs.js.map +1 -0
  50. package/dist/opfs-ahp.cjs +367 -0
  51. package/dist/opfs-ahp.js +368 -0
  52. package/dist/opfs-ahp.js.map +1 -0
  53. package/package.json +3 -3
  54. package/dist/SandboxExecutorFactory-2N27SE3B.js +0 -943
  55. package/dist/chunk-A2S7GSHL.js +0 -1
  56. package/dist/chunk-EVOISBFH.js +0 -5070
  57. package/dist/chunk-JCVMVG3J.js +0 -592
  58. package/dist/chunk-KBZIYCPJ.js +0 -40
  59. package/dist/chunk-KCJWSIDZ.js +0 -246
  60. package/dist/chunk-THWNUGWP.js +0 -204
  61. package/dist/chunk-UC2EPLSW.js +0 -75
  62. package/dist/conversations-XPSTWUMK.js +0 -1
  63. package/dist/dbClient-MAHUR4TO.js +0 -1
  64. package/dist/json-postprocessor-IGYTSWFB.js +0 -12
  65. package/dist/logger-3EE6BUSU.js +0 -1
  66. package/dist/nodefs-RPE52Q4Z.js +0 -21
  67. package/dist/opfs-ahp-QL4REJJW.js +0 -318
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SandboxExecutorFactory.js","names":["logger","logger","stats: Record<string, { availablePermits: number; queueLength: number }>","keysToDelete: string[]","logger","toRemove: string[]","envLines: string[]","logs: string[]","filesToWrite: Array<{ path: string; content: Buffer }>","executor"],"sources":["../src/tools/sandbox-utils.ts","../src/tools/NativeSandboxExecutor.ts","../src/tools/VercelSandboxExecutor.ts","../src/tools/SandboxExecutorFactory.ts"],"sourcesContent":["/**\n * Shared utilities for sandbox executors\n */\n\n/**\n * Create an execution wrapper that handles input/output for function tools\n * This is used by both Native and Vercel sandbox executors\n */\nexport function createExecutionWrapper(executeCode: string, args: Record<string, unknown>): string {\n return `\n// Function tool execution wrapper\nconst args = ${JSON.stringify(args, null, 2)};\n\n// User's function code\nconst execute = ${executeCode}\n\n// Execute the function and output the result\n(async () => {\n try {\n const result = await execute(args);\n // Output result as JSON on the last line\n console.log(JSON.stringify({ success: true, result }));\n } catch (error) {\n console.error(JSON.stringify({ \n success: false, \n error: error instanceof Error ? error.message : String(error) \n }));\n process.exit(1);\n }\n})();\n`;\n}\n\n/**\n * Parse execution result from stdout\n * Returns the parsed result or the raw stdout if parsing fails\n */\nexport function parseExecutionResult(\n stdout: string,\n functionId: string,\n logger?: { warn: (obj: unknown, msg: string) => void }\n): unknown {\n try {\n // The last line of stdout should contain the JSON result\n const outputLines = stdout.split('\\n').filter((line: string) => line.trim());\n const resultLine = outputLines[outputLines.length - 1];\n return JSON.parse(resultLine);\n } catch (parseError) {\n if (logger) {\n logger.warn(\n {\n functionId,\n stdout,\n parseError,\n },\n 'Failed to parse execution result'\n );\n }\n return stdout;\n }\n}\n","/**\n * NativeSandboxExecutor - Function Tool Execution Engine\n * ========================================================\n *\n * Executes user-defined function tools in isolated sandboxes using native Node.js processes.\n * The main challenge here is that we can't just eval() user code - that's a security nightmare.\n * Instead, we spin up separate Node.js processes with their own dependency trees.\n *\n * The tricky part is making this fast. Installing deps every time would be brutal\n * (2-5s per execution), so we cache sandboxes based on their dependency fingerprint.\n *\n * How it works:\n *\n * 1. User calls a function tool\n * 2. We hash the dependencies (e.g., \"axios@1.6.0,lodash@4.17.21\")\n * 3. Check if we already have a sandbox with those deps installed\n * 4. If yes: reuse it. If no: create new one, install deps, cache it\n * 5. Write the user's function code to a temp file\n * 6. Execute it in the sandboxed process with resource limits\n * 7. Return the result\n *\n * Sandbox lifecycle:\n * - Created when first needed for a dependency set\n * - Reused up to 50 times or 5 minutes, whichever comes first\n * - Automatically cleaned up when expired\n * - Failed sandboxes are immediately destroyed\n *\n * Security stuff:\n * - Each execution runs in its own process (not just a function call)\n * - Output limited to 1MB to prevent memory bombs\n * - Timeouts with graceful SIGTERM, then SIGKILL if needed\n * - Runs as non-root when possible\n * - Uses OS temp directory so it gets cleaned up automatically\n *\n * Performance:\n * - Cold start: ~100-500ms (vs 2-5s without caching)\n * - Hot path: ~50-100ms (just execution, no install)\n * - Memory bounded by pool size limits\n *\n * Deployment notes:\n * - Uses /tmp on Linux/macOS, %TEMP% on Windows\n * - Works in Docker, Kubernetes, serverless (Vercel, Lambda)\n * - No files left in project directory (no git pollution)\n *\n * The singleton pattern here is important - we need one shared pool\n * across all tool executions, otherwise caching doesn't work.\n */\n\nimport { spawn } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT,\n FUNCTION_TOOL_SANDBOX_CLEANUP_INTERVAL_MS,\n FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES,\n FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT,\n FUNCTION_TOOL_SANDBOX_POOL_TTL_MS,\n FUNCTION_TOOL_SANDBOX_QUEUE_WAIT_TIMEOUT_MS,\n} from '../constants/execution-limits';\nimport { getLogger } from '../logger';\nimport type { SandboxConfig } from '../types/execution-context';\nimport { createExecutionWrapper, parseExecutionResult } from './sandbox-utils';\n\nconst logger = getLogger('native-sandbox-executor');\n\n/**\n * Semaphore for limiting concurrent executions based on vCPU allocation\n */\nclass ExecutionSemaphore {\n private permits: number;\n private waitQueue: Array<{ resolve: () => void; reject: (error: Error) => void }> = [];\n private readonly maxWaitTime: number;\n\n constructor(permits: number, maxWaitTimeMs = FUNCTION_TOOL_SANDBOX_QUEUE_WAIT_TIMEOUT_MS) {\n this.permits = Math.max(1, permits); // Ensure at least 1 permit\n this.maxWaitTime = maxWaitTimeMs;\n }\n\n async acquire<T>(fn: () => Promise<T>): Promise<T> {\n await new Promise<void>((resolve, reject) => {\n if (this.permits > 0) {\n this.permits--;\n resolve();\n return;\n }\n\n const timeoutId = setTimeout(() => {\n const index = this.waitQueue.findIndex((item) => item.resolve === resolve);\n if (index !== -1) {\n this.waitQueue.splice(index, 1);\n reject(\n new Error(\n `Function execution queue timeout after ${this.maxWaitTime}ms. Too many concurrent executions.`\n )\n );\n }\n }, this.maxWaitTime);\n\n this.waitQueue.push({\n resolve: () => {\n clearTimeout(timeoutId);\n this.permits--;\n resolve();\n },\n reject,\n });\n });\n\n try {\n return await fn();\n } finally {\n this.permits++;\n\n const next = this.waitQueue.shift();\n if (next) {\n next.resolve();\n }\n }\n }\n\n getAvailablePermits(): number {\n return this.permits;\n }\n\n getQueueLength(): number {\n return this.waitQueue.length;\n }\n}\n\nexport interface FunctionToolConfig {\n name?: string;\n description: string;\n inputSchema: Record<string, unknown>;\n executeCode: string;\n dependencies: Record<string, string>;\n sandboxConfig?: SandboxConfig;\n}\n\ninterface SandboxPool {\n [key: string]: {\n sandboxDir: string;\n lastUsed: number;\n useCount: number;\n dependencies: Record<string, string>;\n };\n}\n\nexport class NativeSandboxExecutor {\n private tempDir: string;\n private sandboxPool: SandboxPool = {};\n private static instance: NativeSandboxExecutor | null = null;\n private executionSemaphores: Map<number, ExecutionSemaphore> = new Map();\n\n constructor() {\n this.tempDir = join(tmpdir(), 'inkeep-sandboxes');\n this.ensureTempDir();\n this.startPoolCleanup();\n }\n\n static getInstance(): NativeSandboxExecutor {\n if (!NativeSandboxExecutor.instance) {\n NativeSandboxExecutor.instance = new NativeSandboxExecutor();\n }\n return NativeSandboxExecutor.instance;\n }\n\n private getSemaphore(vcpus: number): ExecutionSemaphore {\n const effectiveVcpus = Math.max(1, vcpus || 1);\n\n if (!this.executionSemaphores.has(effectiveVcpus)) {\n logger.debug({ vcpus: effectiveVcpus }, 'Creating new execution semaphore');\n this.executionSemaphores.set(effectiveVcpus, new ExecutionSemaphore(effectiveVcpus));\n }\n\n const semaphore = this.executionSemaphores.get(effectiveVcpus);\n if (!semaphore) {\n throw new Error(`Failed to create semaphore for ${effectiveVcpus} vCPUs`);\n }\n\n return semaphore;\n }\n\n getExecutionStats(): Record<string, { availablePermits: number; queueLength: number }> {\n const stats: Record<string, { availablePermits: number; queueLength: number }> = {};\n\n for (const [vcpus, semaphore] of this.executionSemaphores.entries()) {\n stats[`vcpu_${vcpus}`] = {\n availablePermits: semaphore.getAvailablePermits(),\n queueLength: semaphore.getQueueLength(),\n };\n }\n\n return stats;\n }\n\n private ensureTempDir() {\n try {\n mkdirSync(this.tempDir, { recursive: true });\n } catch {}\n }\n\n private generateDependencyHash(dependencies: Record<string, string>): string {\n const sortedDeps = Object.keys(dependencies)\n .sort()\n .map((key) => `${key}@${dependencies[key]}`)\n .join(',');\n return createHash('sha256').update(sortedDeps).digest('hex').substring(0, 16);\n }\n\n private getCachedSandbox(dependencyHash: string): string | null {\n const poolKey = dependencyHash;\n const sandbox = this.sandboxPool[poolKey];\n\n if (sandbox && existsSync(sandbox.sandboxDir)) {\n const now = Date.now();\n if (\n now - sandbox.lastUsed < FUNCTION_TOOL_SANDBOX_POOL_TTL_MS &&\n sandbox.useCount < FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT\n ) {\n sandbox.lastUsed = now;\n sandbox.useCount++;\n logger.debug(\n {\n poolKey,\n useCount: sandbox.useCount,\n sandboxDir: sandbox.sandboxDir,\n lastUsed: new Date(sandbox.lastUsed),\n },\n 'Reusing cached sandbox'\n );\n return sandbox.sandboxDir;\n }\n this.cleanupSandbox(sandbox.sandboxDir);\n delete this.sandboxPool[poolKey];\n }\n\n return null;\n }\n\n private addToPool(\n dependencyHash: string,\n sandboxDir: string,\n dependencies: Record<string, string>\n ) {\n const poolKey = dependencyHash;\n\n if (this.sandboxPool[poolKey]) {\n this.cleanupSandbox(this.sandboxPool[poolKey].sandboxDir);\n }\n\n this.sandboxPool[poolKey] = {\n sandboxDir,\n lastUsed: Date.now(),\n useCount: 1,\n dependencies,\n };\n\n logger.debug({ poolKey, sandboxDir }, 'Added sandbox to pool');\n }\n\n private cleanupSandbox(sandboxDir: string) {\n try {\n rmSync(sandboxDir, { recursive: true, force: true });\n logger.debug({ sandboxDir }, 'Cleaned up sandbox');\n } catch (error) {\n logger.warn({ sandboxDir, error }, 'Failed to clean up sandbox');\n }\n }\n\n private startPoolCleanup() {\n setInterval(() => {\n const now = Date.now();\n const keysToDelete: string[] = [];\n\n for (const [key, sandbox] of Object.entries(this.sandboxPool)) {\n if (\n now - sandbox.lastUsed > FUNCTION_TOOL_SANDBOX_POOL_TTL_MS ||\n sandbox.useCount >= FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT\n ) {\n this.cleanupSandbox(sandbox.sandboxDir);\n keysToDelete.push(key);\n }\n }\n\n keysToDelete.forEach((key) => {\n delete this.sandboxPool[key];\n });\n\n if (keysToDelete.length > 0) {\n logger.debug({ cleanedCount: keysToDelete.length }, 'Cleaned up expired sandboxes');\n }\n }, FUNCTION_TOOL_SANDBOX_CLEANUP_INTERVAL_MS);\n }\n\n private detectModuleType(\n executeCode: string,\n configuredRuntime?: 'node22' | 'typescript'\n ): 'cjs' | 'esm' {\n const esmPatterns = [\n /import\\s+.*\\s+from\\s+['\"]/g, // import ... from '...'\n /import\\s*\\(/g, // import(...)\n /export\\s+(default|const|let|var|function|class)/g, // export statements\n /export\\s*\\{/g, // export { ... }\n ];\n\n const cjsPatterns = [\n /require\\s*\\(/g, // require(...)\n /module\\.exports/g, // module.exports\n /exports\\./g, // exports.something\n ];\n\n const hasEsmSyntax = esmPatterns.some((pattern) => pattern.test(executeCode));\n const hasCjsSyntax = cjsPatterns.some((pattern) => pattern.test(executeCode));\n\n if (configuredRuntime === 'typescript') {\n return hasCjsSyntax ? 'cjs' : 'esm';\n }\n\n if (hasEsmSyntax && hasCjsSyntax) {\n logger.warn(\n { executeCode: `${executeCode.substring(0, 100)}...` },\n 'Both ESM and CommonJS syntax detected, defaulting to ESM'\n );\n return 'esm';\n }\n\n if (hasEsmSyntax) {\n return 'esm';\n }\n\n if (hasCjsSyntax) {\n return 'cjs';\n }\n\n return 'cjs';\n }\n\n async executeFunctionTool(toolId: string, args: any, config: FunctionToolConfig): Promise<any> {\n const vcpus = config.sandboxConfig?.vcpus || 1;\n const semaphore = this.getSemaphore(vcpus);\n\n logger.debug(\n {\n toolId,\n vcpus,\n availablePermits: semaphore.getAvailablePermits(),\n queueLength: semaphore.getQueueLength(),\n sandboxConfig: config.sandboxConfig,\n poolSize: Object.keys(this.sandboxPool).length,\n },\n 'Acquiring execution slot for function tool'\n );\n\n return semaphore.acquire(async () => {\n return this.executeInSandbox_Internal(toolId, args, config);\n });\n }\n\n private async executeInSandbox_Internal(\n toolId: string,\n args: any,\n config: FunctionToolConfig\n ): Promise<any> {\n const dependencies = config.dependencies || {};\n const dependencyHash = this.generateDependencyHash(dependencies);\n\n logger.debug(\n {\n toolId,\n dependencies,\n dependencyHash,\n sandboxConfig: config.sandboxConfig,\n poolSize: Object.keys(this.sandboxPool).length,\n },\n 'Executing function tool'\n );\n\n let sandboxDir = this.getCachedSandbox(dependencyHash);\n let isNewSandbox = false;\n\n if (!sandboxDir) {\n sandboxDir = join(this.tempDir, `sandbox-${dependencyHash}-${Date.now()}`);\n mkdirSync(sandboxDir, { recursive: true });\n isNewSandbox = true;\n\n logger.debug(\n {\n toolId,\n dependencyHash,\n sandboxDir,\n dependencies,\n },\n 'Creating new sandbox'\n );\n\n const moduleType = this.detectModuleType(config.executeCode, config.sandboxConfig?.runtime);\n\n const packageJson = {\n name: `function-tool-${toolId}`,\n version: '1.0.0',\n ...(moduleType === 'esm' && { type: 'module' }),\n dependencies,\n scripts: {\n start: moduleType === 'esm' ? 'node index.mjs' : 'node index.js',\n },\n };\n\n writeFileSync(join(sandboxDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf8');\n\n if (Object.keys(dependencies).length > 0) {\n await this.installDependencies(sandboxDir);\n }\n\n this.addToPool(dependencyHash, sandboxDir, dependencies);\n }\n\n try {\n const moduleType = this.detectModuleType(config.executeCode, config.sandboxConfig?.runtime);\n\n const executionCode = createExecutionWrapper(config.executeCode, args);\n const fileExtension = moduleType === 'esm' ? 'mjs' : 'js';\n writeFileSync(join(sandboxDir, `index.${fileExtension}`), executionCode, 'utf8');\n\n const result = await this.executeInSandbox(\n sandboxDir,\n config.sandboxConfig?.timeout || FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT,\n moduleType,\n config.sandboxConfig\n );\n\n return result;\n } catch (error) {\n if (isNewSandbox) {\n this.cleanupSandbox(sandboxDir);\n const poolKey = dependencyHash;\n delete this.sandboxPool[poolKey];\n }\n throw error;\n }\n }\n\n private async installDependencies(sandboxDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // Configure npm environment variables to use sandbox directory\n // This fixes issues in serverless environments like Vercel where\n // the default home directory paths don't exist or aren't writable\n const npmEnv = {\n ...process.env,\n npm_config_cache: join(sandboxDir, '.npm-cache'),\n npm_config_logs_dir: join(sandboxDir, '.npm-logs'),\n npm_config_tmp: join(sandboxDir, '.npm-tmp'),\n HOME: sandboxDir,\n npm_config_update_notifier: 'false',\n npm_config_progress: 'false',\n npm_config_loglevel: 'error',\n };\n\n const npm = spawn('npm', ['install', '--no-audit', '--no-fund'], {\n cwd: sandboxDir,\n stdio: 'pipe',\n env: npmEnv,\n });\n\n let stderr = '';\n\n npm.stdout?.on('data', () => {});\n\n npm.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n npm.on('close', (code) => {\n if (code === 0) {\n logger.debug({ sandboxDir }, 'Dependencies installed successfully');\n resolve();\n } else {\n logger.error({ sandboxDir, code, stderr }, 'Failed to install dependencies');\n reject(new Error(`npm install failed with code ${code}: ${stderr}`));\n }\n });\n\n npm.on('error', (err) => {\n logger.error({ sandboxDir, error: err }, 'Failed to spawn npm install');\n reject(err);\n });\n });\n }\n\n private async executeInSandbox(\n sandboxDir: string,\n timeout: number,\n moduleType: 'cjs' | 'esm',\n _sandboxConfig?: FunctionToolConfig['sandboxConfig']\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const fileExtension = moduleType === 'esm' ? 'mjs' : 'js';\n\n const spawnOptions = {\n cwd: sandboxDir,\n stdio: 'pipe' as const,\n uid: process.getuid ? process.getuid() : undefined,\n gid: process.getgid ? process.getgid() : undefined,\n };\n\n const node = spawn('node', [`index.${fileExtension}`], spawnOptions);\n\n let stdout = '';\n let stderr = '';\n let outputSize = 0;\n\n node.stdout?.on('data', (data: Buffer) => {\n const dataStr = data.toString();\n outputSize += dataStr.length;\n\n if (outputSize > FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES) {\n node.kill('SIGTERM');\n reject(\n new Error(\n `Output size exceeded limit of ${FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES} bytes`\n )\n );\n return;\n }\n\n stdout += dataStr;\n });\n\n node.stderr?.on('data', (data: Buffer) => {\n const dataStr = data.toString();\n outputSize += dataStr.length;\n\n if (outputSize > FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES) {\n node.kill('SIGTERM');\n reject(\n new Error(\n `Output size exceeded limit of ${FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES} bytes`\n )\n );\n return;\n }\n\n stderr += dataStr;\n });\n\n const timeoutId = setTimeout(() => {\n logger.warn({ sandboxDir, timeout }, 'Function execution timed out, killing process');\n node.kill('SIGTERM');\n\n const forceKillTimeout = Math.min(Math.max(timeout / 10, 2000), 5000);\n setTimeout(() => {\n try {\n node.kill('SIGKILL');\n } catch {}\n }, forceKillTimeout);\n\n reject(new Error(`Function execution timed out after ${timeout}ms`));\n }, timeout);\n\n node.on('close', (code: number | null, signal: NodeJS.Signals | null) => {\n clearTimeout(timeoutId);\n\n if (code === 0) {\n try {\n const result = parseExecutionResult(stdout, 'function', logger);\n if (typeof result === 'object' && result !== null && 'success' in result) {\n const parsed = result as { success: boolean; result?: unknown; error?: string };\n if (parsed.success) {\n resolve(parsed.result);\n } else {\n reject(new Error(parsed.error || 'Function execution failed'));\n }\n } else {\n resolve(result);\n }\n } catch (parseError) {\n logger.error({ stdout, stderr, parseError }, 'Failed to parse function result');\n reject(new Error(`Invalid function result: ${stdout}`));\n }\n } else {\n const errorMsg = signal\n ? `Function execution killed by signal ${signal}: ${stderr}`\n : `Function execution failed with code ${code}: ${stderr}`;\n logger.error({ code, signal, stderr }, 'Function execution failed');\n reject(new Error(errorMsg));\n }\n });\n\n node.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n logger.error({ sandboxDir, error }, 'Failed to spawn node process');\n reject(error);\n });\n });\n }\n}\n","import crypto from 'node:crypto';\nimport { Sandbox } from '@vercel/sandbox';\nimport {\n FUNCTION_TOOL_SANDBOX_CLEANUP_INTERVAL_MS,\n FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT,\n FUNCTION_TOOL_SANDBOX_POOL_TTL_MS,\n} from '../constants/execution-limits';\nimport { getLogger } from '../logger';\nimport type { VercelSandboxConfig } from '../types/execution-context';\nimport type { FunctionToolConfig } from './NativeSandboxExecutor';\nimport { createExecutionWrapper, parseExecutionResult } from './sandbox-utils';\n\nconst logger = getLogger('VercelSandboxExecutor');\n\nexport interface ExecutionResult {\n success: boolean;\n result?: unknown;\n error?: string;\n logs?: string[];\n executionTime?: number;\n}\n\ninterface CachedSandbox {\n sandbox: Sandbox;\n createdAt: number;\n useCount: number;\n dependencies: Record<string, string>;\n}\n\n/**\n * Vercel Sandbox Executor with pooling/reuse\n * Executes function tools in isolated Vercel Sandbox MicroVMs\n * Caches and reuses sandboxes based on dependencies to improve performance\n */\nexport class VercelSandboxExecutor {\n private static instance: VercelSandboxExecutor;\n private config: VercelSandboxConfig;\n private sandboxPool: Map<string, CachedSandbox> = new Map();\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n private constructor(config: VercelSandboxConfig) {\n this.config = config;\n logger.info(\n {\n teamId: config.teamId,\n projectId: config.projectId,\n runtime: config.runtime,\n timeout: config.timeout,\n vcpus: config.vcpus,\n },\n 'VercelSandboxExecutor initialized with pooling'\n );\n this.startPoolCleanup();\n }\n\n /**\n * Get singleton instance of VercelSandboxExecutor\n */\n public static getInstance(config: VercelSandboxConfig): VercelSandboxExecutor {\n if (!VercelSandboxExecutor.instance) {\n VercelSandboxExecutor.instance = new VercelSandboxExecutor(config);\n }\n return VercelSandboxExecutor.instance;\n }\n\n /**\n * Generate a hash for dependencies to use as cache key\n */\n private generateDependencyHash(dependencies: Record<string, string>): string {\n const sorted = Object.keys(dependencies)\n .sort()\n .map((key) => `${key}@${dependencies[key]}`)\n .join(',');\n return crypto.createHash('md5').update(sorted).digest('hex').substring(0, 8);\n }\n\n /**\n * Get a cached sandbox if available and still valid\n */\n private getCachedSandbox(dependencyHash: string): Sandbox | null {\n const cached = this.sandboxPool.get(dependencyHash);\n if (!cached) return null;\n\n const now = Date.now();\n const age = now - cached.createdAt;\n\n // Check if sandbox is still valid\n if (\n age > FUNCTION_TOOL_SANDBOX_POOL_TTL_MS ||\n cached.useCount >= FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT\n ) {\n logger.debug(\n {\n dependencyHash,\n age,\n useCount: cached.useCount,\n ttl: FUNCTION_TOOL_SANDBOX_POOL_TTL_MS,\n maxUseCount: FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT,\n },\n 'Sandbox expired, will create new one'\n );\n this.removeSandbox(dependencyHash);\n return null;\n }\n\n logger.debug(\n {\n dependencyHash,\n useCount: cached.useCount,\n age,\n },\n 'Reusing cached sandbox'\n );\n\n return cached.sandbox;\n }\n\n /**\n * Add sandbox to pool\n */\n private addToPool(\n dependencyHash: string,\n sandbox: Sandbox,\n dependencies: Record<string, string>\n ): void {\n this.sandboxPool.set(dependencyHash, {\n sandbox,\n createdAt: Date.now(),\n useCount: 0,\n dependencies,\n });\n\n logger.debug(\n {\n dependencyHash,\n poolSize: this.sandboxPool.size,\n },\n 'Sandbox added to pool'\n );\n }\n\n /**\n * Increment use count for a sandbox\n */\n private incrementUseCount(dependencyHash: string): void {\n const cached = this.sandboxPool.get(dependencyHash);\n if (cached) {\n cached.useCount++;\n }\n }\n\n /**\n * Remove and clean up a sandbox\n */\n private async removeSandbox(dependencyHash: string): Promise<void> {\n const cached = this.sandboxPool.get(dependencyHash);\n if (cached) {\n try {\n await cached.sandbox.stop();\n logger.debug({ dependencyHash }, 'Sandbox stopped');\n } catch (error) {\n logger.warn({ error, dependencyHash }, 'Error stopping sandbox');\n }\n this.sandboxPool.delete(dependencyHash);\n }\n }\n\n /**\n * Start periodic cleanup of expired sandboxes\n */\n private startPoolCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n const toRemove: string[] = [];\n\n for (const [hash, cached] of this.sandboxPool.entries()) {\n const age = now - cached.createdAt;\n if (\n age > FUNCTION_TOOL_SANDBOX_POOL_TTL_MS ||\n cached.useCount >= FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT\n ) {\n toRemove.push(hash);\n }\n }\n\n if (toRemove.length > 0) {\n logger.info(\n {\n count: toRemove.length,\n poolSize: this.sandboxPool.size,\n },\n 'Cleaning up expired sandboxes'\n );\n\n for (const hash of toRemove) {\n this.removeSandbox(hash);\n }\n }\n }, FUNCTION_TOOL_SANDBOX_CLEANUP_INTERVAL_MS);\n }\n\n /**\n * Cleanup all sandboxes and stop cleanup interval\n */\n public async cleanup(): Promise<void> {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n\n logger.info(\n {\n poolSize: this.sandboxPool.size,\n },\n 'Cleaning up all sandboxes'\n );\n\n const promises = Array.from(this.sandboxPool.keys()).map((hash) => this.removeSandbox(hash));\n await Promise.all(promises);\n }\n\n /**\n * Extract environment variable names from code\n * Matches patterns like process.env.VAR_NAME or process.env['VAR_NAME']\n */\n private extractEnvVars(code: string): Set<string> {\n const envVars = new Set<string>();\n\n // Match process.env.VARIABLE_NAME\n const dotNotationRegex = /process\\.env\\.([A-Z_][A-Z0-9_]*)/g;\n let match = dotNotationRegex.exec(code);\n while (match !== null) {\n envVars.add(match[1]);\n match = dotNotationRegex.exec(code);\n }\n\n // Match process.env['VARIABLE_NAME'] or process.env[\"VARIABLE_NAME\"]\n const bracketNotationRegex = /process\\.env\\[['\"]([A-Z_][A-Z0-9_]*)['\"]\\]/g;\n match = bracketNotationRegex.exec(code);\n while (match !== null) {\n envVars.add(match[1]);\n match = bracketNotationRegex.exec(code);\n }\n\n return envVars;\n }\n\n /**\n * Create .env file content from environment variables\n * Note: Currently creates empty placeholders. Values will be populated in the future.\n */\n private createEnvFileContent(envVarNames: Set<string>): string {\n const envLines: string[] = [];\n\n for (const varName of envVarNames) {\n // TODO: Populate with actual values from secure source e.g. credentials manager\n // For now, just create empty placeholders\n envLines.push(`${varName}=\"\"`);\n logger.debug({ varName }, 'Adding environment variable placeholder to sandbox');\n }\n\n return envLines.join('\\n');\n }\n\n /**\n * Execute a function tool in Vercel Sandbox with pooling\n */\n public async executeFunctionTool(\n functionId: string,\n args: Record<string, unknown>,\n toolConfig: FunctionToolConfig\n ): Promise<ExecutionResult> {\n const startTime = Date.now();\n const logs: string[] = [];\n const dependencies = toolConfig.dependencies || {};\n const dependencyHash = this.generateDependencyHash(dependencies);\n\n try {\n logger.info(\n {\n functionId,\n functionName: toolConfig.name,\n dependencyHash,\n poolSize: this.sandboxPool.size,\n },\n 'Executing function in Vercel Sandbox'\n );\n\n // Try to get cached sandbox\n let sandbox = this.getCachedSandbox(dependencyHash);\n let isNewSandbox = false;\n\n // Create new sandbox if not cached\n if (!sandbox) {\n isNewSandbox = true;\n sandbox = await Sandbox.create({\n token: this.config.token,\n teamId: this.config.teamId,\n projectId: this.config.projectId,\n timeout: this.config.timeout,\n resources: {\n vcpus: this.config.vcpus || 1,\n },\n runtime: this.config.runtime,\n });\n\n logger.info(\n {\n functionId,\n sandboxId: sandbox.sandboxId,\n dependencyHash,\n },\n `New sandbox created for function ${functionId}`\n );\n\n // Add to pool for reuse\n this.addToPool(dependencyHash, sandbox, dependencies);\n } else {\n logger.info(\n {\n functionId,\n sandboxId: sandbox.sandboxId,\n dependencyHash,\n },\n `Reusing cached sandbox for function ${functionId}`\n );\n }\n\n // Increment use count\n this.incrementUseCount(dependencyHash);\n\n try {\n // Install dependencies only for new sandboxes\n if (\n isNewSandbox &&\n toolConfig.dependencies &&\n Object.keys(toolConfig.dependencies).length > 0\n ) {\n logger.debug(\n {\n functionId,\n functionName: toolConfig.name,\n dependencies: toolConfig.dependencies,\n },\n 'Installing dependencies in new sandbox'\n );\n\n const packageJson = {\n dependencies: toolConfig.dependencies,\n };\n\n // Write package.json using writeFiles\n const packageJsonContent = JSON.stringify(packageJson, null, 2);\n await sandbox.writeFiles([\n {\n path: 'package.json',\n content: Buffer.from(packageJsonContent, 'utf-8'),\n },\n ]);\n\n // Run npm install\n const installCmd = await sandbox.runCommand({\n cmd: 'npm',\n args: ['install', '--omit=dev'],\n });\n\n const installStdout = await installCmd.stdout();\n const installStderr = await installCmd.stderr();\n\n if (installStdout) {\n logs.push(installStdout);\n }\n if (installStderr) {\n logs.push(installStderr);\n }\n\n if (installCmd.exitCode !== 0) {\n throw new Error(`Failed to install dependencies: ${installStderr}`);\n }\n\n logger.info(\n {\n functionId,\n dependencyHash,\n },\n 'Dependencies installed successfully'\n );\n }\n\n // Create the execution wrapper\n const executionCode = createExecutionWrapper(toolConfig.executeCode, args);\n\n // Detect and prepare environment variables\n const envVars = this.extractEnvVars(toolConfig.executeCode);\n const filesToWrite: Array<{ path: string; content: Buffer }> = [];\n\n // Write the code file\n const filename = this.config.runtime === 'typescript' ? 'execute.ts' : 'execute.js';\n filesToWrite.push({\n path: filename,\n content: Buffer.from(executionCode, 'utf-8'),\n });\n\n // Write .env file if environment variables are detected\n if (envVars.size > 0) {\n const envFileContent = this.createEnvFileContent(envVars);\n if (envFileContent) {\n filesToWrite.push({\n path: '.env',\n content: Buffer.from(envFileContent, 'utf-8'),\n });\n\n logger.info(\n {\n functionId,\n envVarCount: envVars.size,\n envVars: Array.from(envVars),\n },\n 'Creating environment variable placeholders in sandbox'\n );\n }\n }\n\n // Write all files to sandbox\n await sandbox.writeFiles(filesToWrite);\n\n logger.info(\n {\n functionId,\n runtime: this.config.runtime === 'typescript' ? 'tsx' : 'node',\n hasEnvVars: envVars.size > 0,\n },\n `Execution code written to file for runtime ${this.config.runtime}`\n );\n\n // Execute the code with dotenv if env vars exist\n const executeCmd = await (async () => {\n if (envVars.size > 0) {\n // Use dotenv-cli to load .env file automatically\n return sandbox.runCommand({\n cmd: 'npx',\n args:\n this.config.runtime === 'typescript'\n ? ['--yes', 'dotenv-cli', '--', 'npx', 'tsx', filename]\n : ['--yes', 'dotenv-cli', '--', 'node', filename],\n });\n }\n // Execute normally without dotenv\n const runtime = this.config.runtime === 'typescript' ? 'tsx' : 'node';\n return sandbox.runCommand({\n cmd: runtime,\n args: [filename],\n });\n })();\n\n // Collect logs\n const executeStdout = await executeCmd.stdout();\n const executeStderr = await executeCmd.stderr();\n\n if (executeStdout) {\n logs.push(executeStdout);\n }\n if (executeStderr) {\n logs.push(executeStderr);\n }\n\n const executionTime = Date.now() - startTime;\n\n // Check for execution errors\n if (executeCmd.exitCode !== 0) {\n logger.error(\n {\n functionId,\n exitCode: executeCmd.exitCode,\n stderr: executeStderr,\n },\n 'Function execution failed'\n );\n\n return {\n success: false,\n error: executeStderr || 'Function execution failed with non-zero exit code',\n logs,\n executionTime,\n };\n }\n\n // Parse the result from stdout\n const result = parseExecutionResult(executeStdout, functionId, logger);\n\n logger.info(\n {\n functionId,\n executionTime,\n },\n 'Function executed successfully in Vercel Sandbox'\n );\n\n return {\n success: true,\n result,\n logs,\n executionTime,\n };\n } catch (innerError) {\n // On error, remove from pool so it doesn't get reused\n await this.removeSandbox(dependencyHash);\n throw innerError;\n }\n } catch (error) {\n const executionTime = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n logger.error(\n {\n functionId,\n error: errorMessage,\n executionTime,\n },\n 'Vercel Sandbox execution error'\n );\n\n return {\n success: false,\n error: errorMessage,\n logs,\n executionTime,\n };\n }\n }\n}\n","import { getLogger } from '../logger';\nimport type { SandboxConfig, VercelSandboxConfig } from '../types/execution-context';\nimport { type FunctionToolConfig, NativeSandboxExecutor } from './NativeSandboxExecutor';\nimport { VercelSandboxExecutor } from './VercelSandboxExecutor';\n\nconst logger = getLogger('SandboxExecutorFactory');\n\n/**\n * Factory for creating and managing sandbox executors\n * Routes execution to the appropriate sandbox provider (native or Vercel)\n */\nexport class SandboxExecutorFactory {\n private static instance: SandboxExecutorFactory;\n private nativeExecutor: NativeSandboxExecutor | null = null;\n private vercelExecutors: Map<string, VercelSandboxExecutor> = new Map();\n\n private constructor() {\n logger.info({}, 'SandboxExecutorFactory initialized');\n }\n\n /**\n * Get singleton instance of SandboxExecutorFactory\n */\n public static getInstance(): SandboxExecutorFactory {\n if (!SandboxExecutorFactory.instance) {\n SandboxExecutorFactory.instance = new SandboxExecutorFactory();\n }\n return SandboxExecutorFactory.instance;\n }\n\n /**\n * Execute a function tool using the appropriate sandbox provider\n */\n public async executeFunctionTool(\n functionId: string,\n args: Record<string, unknown>,\n config: FunctionToolConfig\n ): Promise<unknown> {\n const sandboxConfig = config.sandboxConfig;\n\n if (!sandboxConfig) {\n throw new Error('Sandbox configuration is required for function tool execution');\n }\n\n if (sandboxConfig.provider === 'native') {\n return this.executeInNativeSandbox(functionId, args, config);\n }\n\n if (sandboxConfig.provider === 'vercel') {\n return this.executeInVercelSandbox(functionId, args, config);\n }\n\n throw new Error(`Unknown sandbox provider: ${(sandboxConfig as SandboxConfig).provider}`);\n }\n\n /**\n * Execute in native sandbox\n */\n private async executeInNativeSandbox(\n functionId: string,\n args: Record<string, unknown>,\n config: FunctionToolConfig\n ): Promise<unknown> {\n if (!this.nativeExecutor) {\n this.nativeExecutor = NativeSandboxExecutor.getInstance();\n logger.info({}, 'Native sandbox executor created');\n }\n\n return this.nativeExecutor.executeFunctionTool(functionId, args, config);\n }\n\n /**\n * Execute in Vercel sandbox\n */\n private async executeInVercelSandbox(\n functionId: string,\n args: Record<string, unknown>,\n config: FunctionToolConfig\n ): Promise<unknown> {\n const vercelConfig = config.sandboxConfig as VercelSandboxConfig;\n\n // Create a key for this Vercel configuration (teamId + projectId)\n const configKey = `${vercelConfig.teamId}:${vercelConfig.projectId}`;\n\n // Get or create Vercel executor for this configuration\n if (!this.vercelExecutors.has(configKey)) {\n const executor = VercelSandboxExecutor.getInstance(vercelConfig);\n this.vercelExecutors.set(configKey, executor);\n logger.info(\n {\n teamId: vercelConfig.teamId,\n projectId: vercelConfig.projectId,\n },\n 'Vercel sandbox executor created'\n );\n }\n\n const executor = this.vercelExecutors.get(configKey);\n if (!executor) {\n throw new Error(`Failed to get Vercel executor for config: ${configKey}`);\n }\n\n const result = await executor.executeFunctionTool(functionId, args, config);\n\n if (!result.success) {\n throw new Error(result.error || 'Vercel sandbox execution failed');\n }\n\n return result.result;\n }\n\n /**\n * Clean up all sandbox executors\n */\n public async cleanup(): Promise<void> {\n logger.info({}, 'Cleaning up sandbox executors');\n\n // Native executor doesn't require explicit cleanup\n this.nativeExecutor = null;\n\n for (const [key, executor] of this.vercelExecutors.entries()) {\n await executor.cleanup();\n this.vercelExecutors.delete(key);\n }\n\n logger.info({}, 'Sandbox executor cleanup completed');\n }\n}\n"],"mappings":"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"}