@vibecontrols/sdk
v2026.512.1
Published
Official TypeScript SDK for VibeControls — thin shell over @burdenoff/sdk-libs
Maintainers
Readme
@vibecontrols/sdk
Official TypeScript SDK for VibeControls - programmatic access to agents, vibes, sessions, tunnels, and more.
Installation
bun add @vibecontrols/sdk
# or
npm install @vibecontrols/sdkQuick Start
import { VibeControlsSDK } from '@vibecontrols/sdk';
const sdk = new VibeControlsSDK({
workspaceEndpoint: 'https://graphqlworkspaces.burdenoff.com/workspaces/graphql',
globalEndpoint: 'https://graphql.burdenoff.com/global/graphql',
});
// Sign in
await sdk.auth.signIn({ username: '[email protected]', password: 'secret' });
// Fetch workspaces and issue workspace token
const workspaces = await sdk.auth.fetchWorkspaces();
await sdk.auth.issueWorkspaceToken(workspaces[0].id, workspaces[0].organizationId);
// Use the SDK
const vibes = await sdk.vibes.list();
const agents = await sdk.agents.list();Authentication
Email / Password
const auth = await sdk.auth.signIn({ username: '[email protected]', password: 'secret' });OAuth2 Device Code Flow
const { userCode, verificationUri, promise } = await sdk.auth.loginWithDeviceCode();
console.log(`Open ${verificationUri} and enter: ${userCode}`);
const tokens = await promise;OAuth2 Authorization Code + PKCE
const challenge = sdk.auth.getAuthorizationUrl({
redirectUri: 'http://localhost:8400/callback',
scopes: ['openid', 'profile', 'email', 'offline_access'],
});
// Redirect user to challenge.url, then exchange the code:
const tokens = await sdk.auth.exchangeAuthCode(code, challenge.codeVerifier, challenge.redirectUri);Client Credentials (M2M / App Auth)
const result = await sdk.auth.authenticateApp(clientId, clientSecret);Workspace Token
await sdk.auth.issueWorkspaceToken(workspaceId, organizationId);Modules
| Module | Access | Description |
|--------|--------|-------------|
| sdk.auth | Auth | Sign in/up, OAuth flows, token management |
| sdk.agents | CRUD | Agent lifecycle, health probes, plugins |
| sdk.vibes | CRUD | Project/environment management |
| sdk.sessions | CRUD | Terminal sessions, start/stop, sharing |
| sdk.notes | CRUD | Notes with tagging and search |
| sdk.configuration | CRUD | Scoped key-value configuration |
| sdk.webhooks | CRUD | Webhook management and testing |
| sdk.docs | CRUD | Documentation sites, pages, revisions |
| sdk.vibeDecks | CRUD | Command button grids |
| sdk.targets | CRUD | SSH/RDP/VNC targets, agent connections |
| sdk.audit | Read | Audit log queries, stats, export |
| sdk.uiSession | CRUD | UI state persistence |
| sdk.tunnels | CRUD | Agent tunnel management |
| sdk.aiToolEvents | CRUD | AI tool event tracking |
Configuration
interface VibeControlsSDKConfig {
workspaceEndpoint: string; // Workspace gateway GraphQL endpoint
globalEndpoint: string; // Global gateway GraphQL endpoint
oidcIssuer?: string; // OIDC issuer URL (derived from globalEndpoint if omitted)
clientId?: string; // OAuth2 client ID
clientSecret?: string; // OAuth2 client secret
redirectUri?: string; // Redirect URI for auth code flow
apiKey?: string; // API key authentication
accessToken?: string; // Pre-existing access token
refreshToken?: string; // Pre-existing refresh token
workspaceToken?: string; // Pre-existing workspace token
timeout?: number; // Request timeout in ms (default: 30000)
autoRefresh?: boolean; // Auto-refresh tokens (default: true)
onTokenRefresh?: (tokens: TokenPair) => void | Promise<void>;
}Error Handling
import { VibeControlsError, AuthenticationError, NetworkError } from '@vibecontrols/sdk';
try {
await sdk.auth.signIn({ username: 'invalid', password: 'invalid' });
} catch (error) {
if (error instanceof AuthenticationError) {
console.error('Auth failed:', error.message);
} else if (error instanceof NetworkError) {
console.error('Network error:', error.message);
}
}Development
bun install
bun run dev # Watch mode
bun run build # Production build
bun run test # Run tests
bun run sanity # All checks (format, lint, type-check, test, build)License
Proprietary - Copyright Burdenoff Consultancy Services Pvt. Ltd.
