{"_id":"@bugzy-ai/sandbox-agent-sdk","_rev":"4-81a39ed020f5ec3cd54090b0c7a875de","name":"@bugzy-ai/sandbox-agent-sdk","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@bugzy-ai/sandbox-agent-sdk","version":"0.1.0","keywords":["claude","anthropic","vercel","sandbox","serverless","ai","agent"],"author":{"name":"Bugzy AI"},"license":"MIT","_id":"@bugzy-ai/sandbox-agent-sdk@0.1.0","maintainers":[{"name":"mslavov","email":"milko.slavov@gmail.com"},{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"}],"homepage":"https://github.com/bugzy-ai/sandbox-agent-sdk#readme","bugs":{"url":"https://github.com/bugzy-ai/sandbox-agent-sdk/issues"},"dist":{"shasum":"0cdecbbf7e90666a2ce273d764d5e744296426aa","tarball":"https://registry.npmjs.org/@bugzy-ai/sandbox-agent-sdk/-/sandbox-agent-sdk-0.1.0.tgz","fileCount":6,"integrity":"sha512-lv3tOhOjSfcZX+wN2dHtucxmqf1zeHlXUaVPLC4JCV483rY1nNmzd4eBzQ2tDR0Y21dASjkr5vNXtGQAeb4aQA==","signatures":[{"sig":"MEQCIAQwhE4dAveJgFLPwojCkEHmNiBdntZuYjajJTN26imFAiAQbsKAvsjMAsv7ISC/mZgyz5FmcbtUTrCt6FQQ0hh/fA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256936},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8016275336748108e164e8dd1876ec5094331c48","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","clean":"rimraf dist","typecheck":"tsc --noEmit","test:oauth":"tsx --env-file=.env.local scripts/test-oauth.ts","test:tools":"tsx --env-file=.env.local scripts/test-tools.ts","test:watch":"jest --watch","test:simple":"tsx --env-file=.env.local scripts/test-simple.ts","test:coverage":"jest --coverage","test:snapshots":"tsx --env-file=.env.local scripts/test-snapshots.ts","test:comprehensive":"tsx --env-file=.env.local scripts/test-comprehensive.ts"},"_npmUser":{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"},"repository":{"url":"git+https://github.com/bugzy-ai/sandbox-agent-sdk.git","type":"git"},"_npmVersion":"11.6.1","description":"Claude Agent SDK with Vercel Sandbox backing for serverless environments","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.24.0","@vercel/sandbox":"^1.4.1","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","jest":"^29.7.0","tsup":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.2.0","typescript":"^5.7.0","@types/jest":"^29.5.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-agent-sdk_0.1.0_1770310545579_0.29437871763776813","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bugzy-ai/sandbox-agent-sdk","version":"0.1.1","keywords":["claude","anthropic","vercel","sandbox","serverless","ai","agent"],"author":{"name":"Bugzy AI"},"license":"MIT","_id":"@bugzy-ai/sandbox-agent-sdk@0.1.1","maintainers":[{"name":"mslavov","email":"milko.slavov@gmail.com"},{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"}],"homepage":"https://github.com/bugzy-ai/sandbox-agent-sdk#readme","bugs":{"url":"https://github.com/bugzy-ai/sandbox-agent-sdk/issues"},"dist":{"shasum":"52b6533d1b29c60c628aa9df142f38d329290aaf","tarball":"https://registry.npmjs.org/@bugzy-ai/sandbox-agent-sdk/-/sandbox-agent-sdk-0.1.1.tgz","fileCount":3,"integrity":"sha512-qLiMBfkXldawHhVwbqupU8fUmj7+oJccVWJACTffltBpJoaT2DrCvms+L4eAlRTA8zzBOCXCCkv0cOc4HEGJbA==","signatures":[{"sig":"MEYCIQCFPs4R1ilRaNSFMzFP+Cue3T4ZLOlsBmtDyVxuhvJ8fwIhAJC4lvoKdGzOVxgS53rX0lr9iEhB4tzp4q9leTiBYWNg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8364},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","clean":"rimraf dist","typecheck":"tsc --noEmit","test:oauth":"tsx --env-file=.env.local scripts/test-oauth.ts","test:tools":"tsx --env-file=.env.local scripts/test-tools.ts","test:watch":"jest --watch","test:simple":"tsx --env-file=.env.local scripts/test-simple.ts","test:coverage":"jest --coverage","test:snapshots":"tsx --env-file=.env.local scripts/test-snapshots.ts","test:comprehensive":"tsx --env-file=.env.local scripts/test-comprehensive.ts"},"_npmUser":{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"},"repository":{"url":"git+https://github.com/bugzy-ai/sandbox-agent-sdk.git","type":"git"},"_npmVersion":"11.6.1","description":"Claude Agent SDK with Vercel Sandbox backing for serverless environments","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.24.0","@vercel/sandbox":"^1.4.1","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","jest":"^29.7.0","tsup":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.2.0","typescript":"^5.7.0","@types/jest":"^29.5.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-agent-sdk_0.1.1_1770313587134_0.24336102338884902","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@bugzy-ai/sandbox-agent-sdk","version":"0.1.2","keywords":["claude","anthropic","vercel","sandbox","serverless","ai","agent"],"author":{"name":"Bugzy AI"},"license":"MIT","_id":"@bugzy-ai/sandbox-agent-sdk@0.1.2","maintainers":[{"name":"mslavov","email":"milko.slavov@gmail.com"},{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"}],"homepage":"https://github.com/bugzy-ai/sandbox-agent-sdk#readme","bugs":{"url":"https://github.com/bugzy-ai/sandbox-agent-sdk/issues"},"dist":{"shasum":"aba0f3d3329840c6703b26746af911b15920513d","tarball":"https://registry.npmjs.org/@bugzy-ai/sandbox-agent-sdk/-/sandbox-agent-sdk-0.1.2.tgz","fileCount":6,"integrity":"sha512-m1jNdMn9FzGNr+61McB0yBV8xVudBrwXp8wSMsvPwjBPJ9xTRo3JRGpDF7ZZCI73nS8BZAMyPaSRTMaQXd/dLA==","signatures":[{"sig":"MEQCIHjxSAdozbNMXpkvNieSbY31G38x3ZnOSxegGUKMZ2hEAiBBMa+ow1Ho37LmYRkri/THGRS98vCUI/lf3iFB4AlFqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256892},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","clean":"rimraf dist","typecheck":"tsc --noEmit","test:oauth":"tsx --env-file=.env.local scripts/test-oauth.ts","test:tools":"tsx --env-file=.env.local scripts/test-tools.ts","test:watch":"jest --watch","test:simple":"tsx --env-file=.env.local scripts/test-simple.ts","test:coverage":"jest --coverage","test:snapshots":"tsx --env-file=.env.local scripts/test-snapshots.ts","test:comprehensive":"tsx --env-file=.env.local scripts/test-comprehensive.ts"},"_npmUser":{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"},"repository":{"url":"git+https://github.com/bugzy-ai/sandbox-agent-sdk.git","type":"git"},"_npmVersion":"11.6.1","description":"Claude Agent SDK with Vercel Sandbox backing for serverless environments","directories":{},"_nodeVersion":"24.11.0","dependencies":{"zod":"^3.24.0","@vercel/sandbox":"^1.4.1","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","jest":"^29.7.0","tsup":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.2.0","typescript":"^5.7.0","@types/jest":"^29.5.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sandbox-agent-sdk_0.1.2_1770313996198_0.29154835273772783","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bugzy-ai/sandbox-agent-sdk","version":"0.1.3","description":"Claude Agent SDK with Vercel Sandbox backing for serverless environments","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","clean":"rimraf dist","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:simple":"tsx --env-file=.env.local scripts/test-simple.ts","test:tools":"tsx --env-file=.env.local scripts/test-tools.ts","test:comprehensive":"tsx --env-file=.env.local scripts/test-comprehensive.ts","test:snapshots":"tsx --env-file=.env.local scripts/test-snapshots.ts","test:oauth":"tsx --env-file=.env.local scripts/test-oauth.ts"},"dependencies":{"@vercel/sandbox":"^1.4.1","@modelcontextprotocol/sdk":"^1.12.0","zod":"^4.0.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^22.0.0","jest":"^29.7.0","rimraf":"^5.0.0","ts-jest":"^29.2.0","tsup":"^8.0.0","tsx":"^4.7.0","typescript":"^5.7.0"},"engines":{"node":">=18"},"keywords":["claude","anthropic","vercel","sandbox","serverless","ai","agent"],"author":{"name":"Bugzy AI"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/bugzy-ai/sandbox-agent-sdk.git"},"homepage":"https://github.com/bugzy-ai/sandbox-agent-sdk#readme","bugs":{"url":"https://github.com/bugzy-ai/sandbox-agent-sdk/issues"},"_id":"@bugzy-ai/sandbox-agent-sdk@0.1.3","_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-hvLCW5RbAbVLFOZH4hiHr7DVd5KtQvgIX/Wkcssgl06gmw/yqRNBC90ouk4Lf7KLxN5UbJejJYigaye3Up2wvQ==","shasum":"3f67ee04bd8efab631416e48e12f0a0ddae7c7fb","tarball":"https://registry.npmjs.org/@bugzy-ai/sandbox-agent-sdk/-/sandbox-agent-sdk-0.1.3.tgz","fileCount":6,"unpackedSize":263959,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC/u/qHHGK1ncKkjQaT0EW/w9j9JsHdwQu+O2FlSU0PMgIhALtpbtm1Ze5xee5Jkq2znyoXqFLwyIcDcyh4krR9PrkN"}]},"_npmUser":{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"},"directories":{},"maintainers":[{"name":"mslavov","email":"milko.slavov@gmail.com"},{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sandbox-agent-sdk_0.1.3_1770315666627_0.7210002672423941"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-05T16:55:45.309Z","modified":"2026-02-05T18:21:06.930Z","0.1.0":"2026-02-05T16:55:45.743Z","0.1.1":"2026-02-05T17:46:27.264Z","0.1.2":"2026-02-05T17:53:16.371Z","0.1.3":"2026-02-05T18:21:06.767Z"},"bugs":{"url":"https://github.com/bugzy-ai/sandbox-agent-sdk/issues"},"author":{"name":"Bugzy AI"},"license":"MIT","homepage":"https://github.com/bugzy-ai/sandbox-agent-sdk#readme","keywords":["claude","anthropic","vercel","sandbox","serverless","ai","agent"],"repository":{"type":"git","url":"git+https://github.com/bugzy-ai/sandbox-agent-sdk.git"},"description":"Claude Agent SDK with Vercel Sandbox backing for serverless environments","maintainers":[{"name":"mslavov","email":"milko.slavov@gmail.com"},{"name":"dimitar-panayotov","email":"dimitar2306@gmail.com"}],"readme":"# Claude Agent SDK with Vercel Sandbox Backing\r\n\r\nRun the Claude CLI in Vercel's serverless environment using Vercel Sandbox microVMs.\r\n\r\n## Problem\r\n\r\nThe Claude Agent SDK works locally but fails on Vercel deployment:\r\n```\r\nError: Claude Code executable not found\r\n```\r\n\r\nVercel's serverless functions don't have the Claude CLI installed.\r\n\r\n## Solution\r\n\r\nThis SDK runs the Claude CLI inside Vercel Sandbox microVMs, enabling Claude Agent functionality in serverless environments.\r\n\r\n```\r\n[Your API Route] → [This SDK] → [Vercel Sandbox] → [Claude CLI] → [Anthropic API]\r\n```\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @bugzy-ai/sandbox-agent-sdk\r\n```\r\n\r\n## Quick Start\r\n\r\n```typescript\r\nimport { query } from '@bugzy-ai/sandbox-agent-sdk';\r\n\r\nconst result = await query({\r\n  prompt: 'What is the capital of France?',\r\n});\r\n\r\nconsole.log(result.text); // \"The capital of France is Paris.\"\r\n```\r\n\r\n## Features\r\n\r\n- ✅ **Drop-in replacement** for local Claude CLI usage\r\n- ✅ **Streaming support** with SSE for real-time responses\r\n- ✅ **Multi-turn conversations** with session management\r\n- ✅ **Custom tools** via MCP (Model Context Protocol)\r\n- ✅ **Snapshots** for faster cold starts\r\n- ✅ **VFS** for mounting GitHub repos or custom files\r\n\r\n## API\r\n\r\n### Simple Query\r\n\r\n```typescript\r\nimport { query } from '@bugzy-ai/sandbox-agent-sdk';\r\n\r\n// Get just the text response\r\nconst q = query({ prompt: 'Hello!' });\r\nconst text = await q.text();\r\nconsole.log(text);\r\n```\r\n\r\n### Streaming\r\n\r\n```typescript\r\nimport { query, isAssistantMessage, extractText } from '@bugzy-ai/sandbox-agent-sdk';\r\n\r\nfor await (const message of query({ prompt: 'Tell me a story' })) {\r\n  if (isAssistantMessage(message)) {\r\n    process.stdout.write(extractText(message));\r\n  }\r\n}\r\n```\r\n\r\n### Multi-turn Conversations\r\n\r\n```typescript\r\nimport { VercelClaudeClient } from '@bugzy-ai/sandbox-agent-sdk';\r\n\r\nconst client = new VercelClaudeClient({\r\n  systemPrompt: 'You are a helpful assistant.',\r\n});\r\n\r\nawait client.connect();\r\n\r\nconst response1 = await client.chat('My name is Alice.');\r\nconst response2 = await client.chat('What is my name?');\r\n// Claude remembers the conversation context\r\n\r\nawait client.disconnect();\r\n```\r\n\r\n### Custom Tools\r\n\r\n```typescript\r\nimport { tool, createSdkMcpServer } from '@bugzy-ai/sandbox-agent-sdk';\r\nimport { z } from 'zod';\r\n\r\nconst weatherTool = tool(\r\n  'get_weather',\r\n  'Get the current weather for a location',\r\n  { location: z.string() },\r\n  async ({ location }) => {\r\n    const weather = await fetchWeather(location);\r\n    return { content: [{ type: 'text', text: weather }] };\r\n  }\r\n);\r\n\r\nconst server = createSdkMcpServer({\r\n  name: 'my-tools',\r\n  tools: [weatherTool],\r\n});\r\n```\r\n\r\n### Snapshots (Faster Cold Starts)\r\n\r\n```typescript\r\nimport { createSnapshot, query } from '@bugzy-ai/sandbox-agent-sdk';\r\n\r\n// Create once (during deployment)\r\nconst snapshotId = await createSnapshot({ name: 'claude-ready' });\r\n\r\n// Use for all queries\r\nconst result = await query({\r\n  prompt: 'Hello!',\r\n  snapshotId,\r\n});\r\n```\r\n\r\n## Next.js API Route Example\r\n\r\n```typescript\r\n// app/api/chat/route.ts\r\nimport { NextRequest } from 'next/server';\r\nimport { query, isAssistantMessage, extractText } from '@bugzy-ai/sandbox-agent-sdk';\r\n\r\nexport const runtime = 'nodejs';\r\nexport const maxDuration = 300;\r\n\r\nexport async function POST(request: NextRequest) {\r\n  const { prompt } = await request.json();\r\n\r\n  const stream = new ReadableStream({\r\n    async start(controller) {\r\n      for await (const msg of query({ prompt })) {\r\n        if (isAssistantMessage(msg)) {\r\n          controller.enqueue(new TextEncoder().encode(extractText(msg)));\r\n        }\r\n      }\r\n      controller.close();\r\n    },\r\n  });\r\n\r\n  return new Response(stream, {\r\n    headers: { 'Content-Type': 'text/plain' },\r\n  });\r\n}\r\n```\r\n\r\n## Environment Variables\r\n\r\n```bash\r\n# Required\r\nANTHROPIC_API_KEY=sk-ant-xxx\r\n\r\n# Optional (for faster cold starts)\r\nCLAUDE_SANDBOX_SNAPSHOT_ID=snap_xxx\r\n\r\n# Optional (for team deployments)\r\nVERCEL_TEAM_ID=team_xxx\r\n```\r\n\r\n## Documentation\r\n\r\n- [Setup Guide](./docs/SETUP.md) - Detailed setup instructions\r\n- [Examples](./examples/) - Working code examples\r\n\r\n## Examples\r\n\r\n- [`basic-query`](./examples/basic-query/) - Simple query example\r\n- [`streaming-api`](./examples/streaming-api/) - Next.js API with SSE\r\n- [`custom-tools`](./examples/custom-tools/) - Database query tools\r\n\r\n## Architecture\r\n\r\n| Component | Location | Purpose |\r\n|-----------|----------|---------|\r\n| Your API Route | Vercel Functions | Entry point, handles requests |\r\n| This SDK | Vercel Functions | Manages sandbox lifecycle |\r\n| Vercel Sandbox | MicroVM | Runs Claude CLI in isolated environment |\r\n| Claude CLI | Inside Sandbox | Communicates with Anthropic API |\r\n| Custom Tools | Your Functions | Access databases, APIs (secure) |\r\n\r\n## Performance\r\n\r\n| Scenario | Cold Start | Warm |\r\n|----------|------------|------|\r\n| Fresh sandbox | ~45s | - |\r\n| With snapshot | ~3-5s | ~1s |\r\n\r\n**Recommendation**: Always use snapshots in production.\r\n\r\n## Security\r\n\r\n- Anthropic API key is passed to sandbox but never logged\r\n- Custom tools run in your application, not the sandbox\r\n- Each sandbox is an isolated microVM\r\n- Database credentials stay in your application\r\n\r\n## License\r\n\r\nMIT\r\n\r\n## Contributing\r\n\r\nContributions welcome! Please read the contributing guidelines first.\r\n","readmeFilename":"README.md"}