{"_id":"@agent-foundry/studio","_rev":"3-07c1431cc7ffddca58321d92d51d9319","name":"@agent-foundry/studio","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@agent-foundry/studio","version":"1.0.0","keywords":["agent-foundry","studio","build-studio","oss","supabase","typescript","sdk"],"author":{"name":"Agent Foundry"},"license":"MIT","_id":"@agent-foundry/studio@1.0.0","maintainers":[{"name":"agentfoundry","email":"qwen.wenquan@gmail.com"}],"dist":{"shasum":"2d8bad068b2265f3c2d7d4861d402dbc22ecf1e3","tarball":"https://registry.npmjs.org/@agent-foundry/studio/-/studio-1.0.0.tgz","fileCount":88,"integrity":"sha512-6YHZmDNrDQRUGoel5O+cffHBrAGBS8JdF1im6j2AHhNbGZRINzw1Pecw+S5qlgHRttZIQI+icqoHB5ScMfwdaQ==","signatures":[{"sig":"MEYCIQDCOoQ0BGBXVlngJJ65F1sroGbWPJdSkQ3u90cksuNwTQIhANMuyv5CTLWYWFMXLLRfM75FHbXFgrVI4bsr+vN18adx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178629},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./db":{"types":"./dist/db/index.d.ts","import":"./dist/db/index.js"},"./oss":{"types":"./dist/oss/index.d.ts","import":"./dist/oss/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"bd3488e1254ae57be64f034d76ffdcfc1c2de41e","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rimraf dist","prepublishOnly":"pnpm run clean && pnpm run build"},"_npmUser":{"name":"agentfoundry","email":"qwen.wenquan@gmail.com"},"_npmVersion":"11.6.2","description":"Full SDK for Agent Foundry Build Studio - types, OSS upload, and Supabase client","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ali-oss":"^6.21.0","@supabase/supabase-js":"^2.47.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^5.0.5","typescript":"^5.3.3","@types/node":"^20.10.0","@types/ali-oss":"^6.16.0"},"_npmOperationalInternal":{"tmp":"tmp/studio_1.0.0_1768706751752_0.815236265402548","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@agent-foundry/studio","version":"1.0.1","keywords":["agent-foundry","studio","build-studio","oss","supabase","typescript","sdk"],"author":{"name":"Agent Foundry"},"license":"MIT","_id":"@agent-foundry/studio@1.0.1","maintainers":[{"name":"agentfoundry","email":"qwen.wenquan@gmail.com"}],"dist":{"shasum":"0291d6f7efba74f9ce4b8ed98f605138152cc0b0","tarball":"https://registry.npmjs.org/@agent-foundry/studio/-/studio-1.0.1.tgz","fileCount":88,"integrity":"sha512-1hKQQWffscFyOZYWKg2xcGmsI15HsYEz/zbfk8Lm+GwxgftIcrcPE9+Bc6kb2BoOTYbjXVHdN3Mi5EmbrTkwwg==","signatures":[{"sig":"MEUCIQCaov5K6NlUECc2jluFGqiBJnVUaP24IjtUUvV19yat1AIgb3JpWn6AC1LlnQ2emwdJJDl7IvYr8/TUTTQhL+T1l78=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190036},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./db":{"types":"./dist/db/index.d.ts","import":"./dist/db/index.js"},"./oss":{"types":"./dist/oss/index.d.ts","import":"./dist/oss/index.js"},"./types":{"types":"./dist/types/index.d.ts","import":"./dist/types/index.js"}},"gitHead":"bd3488e1254ae57be64f034d76ffdcfc1c2de41e","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","clean":"rimraf dist","test:watch":"vitest","prepublishOnly":"pnpm run clean && pnpm run build","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"agentfoundry","email":"qwen.wenquan@gmail.com"},"_npmVersion":"11.6.2","description":"Full SDK for Agent Foundry Build Studio - types, OSS upload, and Supabase client","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ali-oss":"^6.21.0","@supabase/supabase-js":"^2.47.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jose":"^5.2.0","dotenv":"^16.3.1","rimraf":"^5.0.5","vitest":"^2.0.0","typescript":"^5.3.3","@types/node":"^20.10.0","@types/ali-oss":"^6.16.0"},"_npmOperationalInternal":{"tmp":"tmp/studio_1.0.1_1768739543520_0.6195667180739144","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@agent-foundry/studio","version":"1.0.2","description":"Full SDK for Agent Foundry Build Studio - types, BFF API client, OSS upload, and Supabase client","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"},"./types":{"import":"./dist/types/index.js","types":"./dist/types/index.d.ts"},"./oss":{"import":"./dist/oss/index.js","types":"./dist/oss/index.d.ts"},"./bff":{"import":"./dist/bff/index.js","types":"./dist/bff/index.d.ts"},"./db":{"import":"./dist/db/index.js","types":"./dist/db/index.d.ts"}},"scripts":{"build":"tsc","dev":"tsc --watch","clean":"rimraf dist","test":"vitest run","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts","prepublishOnly":"pnpm run clean && pnpm run build"},"keywords":["agent-foundry","studio","build-studio","oss","supabase","typescript","sdk"],"author":{"name":"Agent Foundry"},"license":"MIT","dependencies":{"@supabase/supabase-js":"^2.47.0","ali-oss":"^6.21.0"},"devDependencies":{"@types/ali-oss":"^6.16.0","@types/node":"^20.10.0","dotenv":"^16.3.1","jose":"^5.2.0","rimraf":"^5.0.5","typescript":"^5.3.3","vitest":"^2.0.0"},"publishConfig":{"access":"public"},"gitHead":"ae37c5cfc4cfca2bd6c5b963c9c863d5bc0f339d","_id":"@agent-foundry/studio@1.0.2","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-DDfHPM05r5nDYjjzfgJJ1+czF0vM+y66XMJMBlS75P0oQQuhi9gcefL3LDHQaREFyufnp+tub7vpcxmJwqgjTA==","shasum":"3d6d6ed7ee8ce2342b54365098f3b63d722b15b1","tarball":"https://registry.npmjs.org/@agent-foundry/studio/-/studio-1.0.2.tgz","fileCount":103,"unpackedSize":257717,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHbCK2jbGeMLnRPb69vjOmzwHSRij0AO0DWDIcoI/fMVAiEAnroNwH7h5aQNAH1vP4ana44uzd/Rodmd9lEGEX7U758="}]},"_npmUser":{"name":"agentfoundry","email":"qwen.wenquan@gmail.com"},"directories":{},"maintainers":[{"name":"agentfoundry","email":"qwen.wenquan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/studio_1.0.2_1768745515723_0.029208103662876184"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-18T03:25:51.628Z","modified":"2026-01-18T14:11:56.012Z","1.0.0":"2026-01-18T03:25:51.913Z","1.0.1":"2026-01-18T12:32:23.676Z","1.0.2":"2026-01-18T14:11:55.866Z"},"author":{"name":"Agent Foundry"},"license":"MIT","keywords":["agent-foundry","studio","build-studio","oss","supabase","typescript","sdk"],"description":"Full SDK for Agent Foundry Build Studio - types, BFF API client, OSS upload, and Supabase client","maintainers":[{"name":"agentfoundry","email":"qwen.wenquan@gmail.com"}],"readme":"# @agent-foundry/studio\r\n\r\nFull SDK for Agent Foundry Build Studio - provides types, BFF API client, Alibaba Cloud OSS upload utilities, and Supabase database client.\r\n\r\n## Installation\r\n\r\n```bash\r\npnpm add @agent-foundry/studio\r\n```\r\n\r\n## Features\r\n\r\n- **Types**: TypeScript interfaces for Studio projects, deployments, workspaces, and users\r\n- **BFF Client**: API client for write operations (create, update, delete projects/deployments)\r\n- **OSS Client**: Direct upload to Alibaba Cloud OSS with STS credentials\r\n- **DB Client**: Supabase client for read operations (list, get projects/deployments)\r\n\r\n## Recommended Usage Pattern (Hybrid Approach)\r\n\r\nDue to RLS (Row Level Security) restrictions, this SDK uses a **hybrid access pattern**:\r\n\r\n| Operation | Client | Reason |\r\n|-----------|--------|--------|\r\n| **Read** (list, get) | Supabase Client (`/db`) | Direct database access, low latency |\r\n| **Write** (create, update, delete) | BFF Client (`/bff`) | Bypasses RLS, server-side validation |\r\n| **File Upload** | DirectUploader (`/oss`) | Direct OSS upload with STS credentials |\r\n\r\n```\r\n┌─────────────────────────────────────────────────────────────┐\r\n│                     Desktop App / Client                     │\r\n└───────────────────────────┬─────────────────────────────────┘\r\n                            │\r\n            ┌───────────────┼───────────────┐\r\n            ▼               ▼               ▼\r\n     ┌────────────┐  ┌────────────┐  ┌────────────┐\r\n     │ BFF Client │  │ DB Client  │  │ OSS Upload │\r\n     │  (writes)  │  │  (reads)   │  │  (files)   │\r\n     └──────┬─────┘  └──────┬─────┘  └──────┬─────┘\r\n            │               │               │\r\n            ▼               ▼               ▼\r\n     ┌────────────┐  ┌────────────┐  ┌────────────┐\r\n     │  BFF API   │  │  Supabase  │  │ Alibaba    │\r\n     │ (FastAPI)  │  │ PostgreSQL │  │ Cloud OSS  │\r\n     └────────────┘  └────────────┘  └────────────┘\r\n```\r\n\r\n## Usage\r\n\r\n### Types Only\r\n\r\n```typescript\r\nimport type { StudioProject, Deployment } from '@agent-foundry/studio/types';\r\n```\r\n\r\n### Write Operations (BFF Client) - Recommended\r\n\r\nUse the BFF client for all write operations. It uses service_role credentials on the server side, bypassing RLS.\r\n\r\n```typescript\r\nimport { createBFFClient } from '@agent-foundry/studio/bff';\r\n\r\nconst bff = createBFFClient({\r\n  baseUrl: 'http://localhost:11001',\r\n  authToken: 'your-supabase-jwt',  // User's access token\r\n});\r\n\r\n// Create a project\r\nconst project = await bff.projects.create({\r\n  name: 'My App',\r\n  slug: 'my-app',\r\n  rootPath: '/Users/me/projects/my-app',\r\n});\r\n\r\n// Update a project\r\nawait bff.projects.update(project.id, {\r\n  name: 'My Updated App',\r\n});\r\n\r\n// Delete a project\r\nawait bff.projects.delete(project.id);\r\n\r\n// Fork a project\r\nconst fork = await bff.projects.fork(project.id, {\r\n  newSlug: 'my-app-fork',\r\n  newRootPath: '/Users/me/projects/my-app-fork',\r\n});\r\n\r\n// Publish to Feed\r\nconst published = await bff.projects.publish(project.id, {\r\n  status: 'stable',\r\n});\r\n```\r\n\r\n### Read Operations (Supabase Client)\r\n\r\nUse the Supabase client for read operations. Requires authenticated user's session.\r\n\r\n```typescript\r\nimport { createStudioClient } from '@agent-foundry/studio/db';\r\n\r\nconst db = createStudioClient({\r\n  supabaseUrl: 'https://your-project.supabase.co',\r\n  supabaseKey: 'your-anon-key',\r\n  // Or pass an existing Supabase client with user session\r\n  existingClient: supabaseClientWithSession,\r\n});\r\n\r\n// List projects\r\nconst projects = await db.projects.list({\r\n  framework: 'vite-react',\r\n  limit: 10,\r\n});\r\n\r\n// Get a project by ID\r\nconst project = await db.projects.getById('project-uuid');\r\n\r\n// Get a project by slug\r\nconst projectBySlug = await db.projects.getBySlug('my-app');\r\n\r\n// List deployments\r\nconst deployments = await db.deployments.list({\r\n  projectId: 'project-uuid',\r\n});\r\n\r\n// Get latest published deployment\r\nconst latest = await db.deployments.getLatestPublished('project-uuid');\r\n```\r\n\r\n### File Upload (OSS)\r\n\r\nUse DirectUploader for uploading build artifacts. It handles the complete workflow:\r\n\r\n1. Requests STS credentials from BFF\r\n2. Uploads files directly to OSS\r\n3. Notifies BFF of completion\r\n\r\n```typescript\r\nimport { DirectUploader } from '@agent-foundry/studio/oss';\r\n\r\nconst uploader = new DirectUploader({\r\n  bffBaseUrl: 'http://localhost:11001',\r\n  authToken: 'your-supabase-jwt',\r\n});\r\n\r\n// Upload a built bundle\r\nconst result = await uploader.upload({\r\n  projectId: 'project-uuid',\r\n  files: [\r\n    { path: 'index.html', content: indexHtml, contentType: 'text/html' },\r\n    { path: 'assets/main.js', content: mainJs, contentType: 'application/javascript' },\r\n  ],\r\n  onProgress: (progress) => {\r\n    console.log(`${progress.stage}: ${progress.percent}%`);\r\n  },\r\n});\r\n\r\nif (result.success) {\r\n  console.log(`Deployed to: ${result.url}`);\r\n}\r\n```\r\n\r\n## Why Hybrid Approach?\r\n\r\n1. **Security**: Write operations go through BFF with service_role, no need to expose sensitive keys\r\n2. **Performance**: Read operations use direct Supabase connection, minimal latency\r\n3. **Validation**: BFF can validate writes (slug uniqueness, path validation, etc.)\r\n4. **Consistency**: Deployment state machine is controlled server-side\r\n\r\n## Testing\r\n\r\n### Unit Tests\r\n\r\n```bash\r\npnpm test          # Run all unit tests\r\npnpm test:watch    # Watch mode\r\n```\r\n\r\n### Integration Tests\r\n\r\nIntegration tests run against a real BFF deployment:\r\n\r\n```bash\r\n# Set required environment variables\r\nexport BFF_URL=http://localhost:11001\r\nexport SUPABASE_JWT_SECRET=your-secret\r\n\r\n# Run integration tests\r\npnpm test:integration\r\n```\r\n\r\nSee [test/README.md](test/README.md) for detailed test documentation.\r\n\r\n## API Reference\r\n\r\n### BFF Client (`@agent-foundry/studio/bff`)\r\n\r\n- `createBFFClient(config)` - Create BFF client\r\n- `bff.projects.create(input)` - Create project\r\n- `bff.projects.get(id)` - Get project\r\n- `bff.projects.list(options)` - List projects\r\n- `bff.projects.update(id, input)` - Update project\r\n- `bff.projects.delete(id)` - Delete project\r\n- `bff.projects.fork(id, options)` - Fork project\r\n- `bff.projects.publish(id, options)` - Publish to Feed\r\n- `bff.deployments.start(input)` - Start deployment\r\n- `bff.deployments.get(id)` - Get deployment\r\n- `bff.deployments.list(projectId, limit)` - List deployments\r\n- `bff.deployments.updateStatus(id, input)` - Update status\r\n- `bff.deployments.complete(id, input)` - Mark complete\r\n- `bff.deployments.fail(id, input)` - Mark failed\r\n\r\n### DB Client (`@agent-foundry/studio/db`)\r\n\r\n- `createStudioClient(config)` - Create Supabase client\r\n- `db.projects.getById(id)` - Get project by ID\r\n- `db.projects.getBySlug(slug)` - Get project by slug\r\n- `db.projects.list(filters)` - List projects\r\n- `db.deployments.getById(id)` - Get deployment by ID\r\n- `db.deployments.list(filters)` - List deployments\r\n- `db.deployments.getLatestPublished(projectId)` - Get latest published\r\n\r\n### OSS Client (`@agent-foundry/studio/oss`)\r\n\r\n- `DirectUploader` - High-level upload client\r\n- `AliOSSClient` - Low-level OSS client\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}