Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@computesdk/provider

Package Overview
Dependencies
Maintainers
1
Versions
40
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@computesdk/provider - npm Package Compare versions

Comparing version
1.0.33
to
1.1.0
+446
-1
dist/index.d.mts

@@ -409,2 +409,319 @@ import { CreateSandboxOptions, SandboxInterface, Runtime, CodeResult, RunCommandOptions, CommandResult, SandboxInfo, FileEntry, ExplicitComputeConfig, ProviderName, CallableCompute } from 'computesdk';

/**
* Browser Provider Types
*
* Types for browser providers (Browserbase, Kernel, etc.)
* Browser providers manage cloud browser sessions, distinct from sandbox providers
* which manage code execution environments.
*/
/**
* Browser session info returned from provider APIs
*/
interface BrowserSession {
/** Unique session identifier */
sessionId: string;
/** CDP or WebSocket connection URL */
connectUrl: string;
/** Current session status */
status: 'created' | 'running' | 'completed' | 'failed' | 'timed_out';
/** Session creation timestamp */
createdAt?: Date;
/** Provider-specific metadata */
metadata?: Record<string, unknown>;
}
/**
* Options for creating a browser session
*/
interface CreateBrowserSessionOptions {
/** Proxy configuration — true for provider default, or detailed config */
proxies?: boolean | ProxyConfig[];
/** Browser viewport dimensions */
viewport?: {
width: number;
height: number;
};
/** Session timeout in seconds */
timeout?: number;
/** Keep session alive after script disconnects */
keepAlive?: boolean;
/** Enable session recording (default: true) */
recording?: boolean;
/** Enable session logging (default: true) */
logging?: boolean;
/** Enable stealth/anti-detection mode */
stealth?: boolean;
/** Browser profile/context ID for session persistence */
profileId?: string;
/** Extension IDs to load */
extensionIds?: string[];
/** Region/datacenter preference */
region?: string;
/** Custom user metadata */
userMetadata?: Record<string, string>;
}
/**
* Proxy configuration for browser sessions
*/
interface ProxyConfig {
/** Proxy type */
type: 'residential' | 'isp' | 'datacenter' | 'custom';
/** Proxy server URL (for custom type) */
server?: string;
/** Proxy username */
username?: string;
/** Proxy password */
password?: string;
/** Geolocation targeting */
geolocation?: {
country?: string;
state?: string;
city?: string;
};
/** Domain pattern to route through this proxy */
domainPattern?: string;
}
/**
* Browser profile (persistent context — cookies, storage, etc.)
*/
interface BrowserProfile {
/** Unique profile identifier */
profileId: string;
/** Human-readable name */
name?: string;
/** Creation timestamp */
createdAt?: Date;
/** Provider-specific metadata */
metadata?: Record<string, unknown>;
}
/**
* Options for creating a browser profile
*/
interface CreateBrowserProfileOptions {
/** Human-readable name */
name?: string;
/** Custom metadata */
metadata?: Record<string, string>;
}
/**
* Browser extension
*/
interface BrowserExtension {
/** Unique extension identifier */
extensionId: string;
/** Extension name */
name?: string;
}
/**
* Options for uploading/creating a browser extension
*/
interface CreateBrowserExtensionOptions {
/** Extension file data */
file: Uint8Array | string;
/** Extension name */
name?: string;
}
/**
* Browser pool — pre-warmed browser instances for instant acquisition
*/
interface BrowserPool {
/** Unique pool identifier */
poolId: string;
/** Pool name */
name?: string;
/** Number of idle instances ready */
idleCount?: number;
/** Number of active instances in use */
activeCount?: number;
}
/**
* Options for creating a browser pool
*/
interface CreateBrowserPoolOptions {
/** Pool name */
name: string;
/** Desired number of pre-warmed instances */
size: number;
/** Default session options for pool instances */
sessionDefaults?: CreateBrowserSessionOptions;
}
/**
* Browser session log entry
*/
interface BrowserLog {
/** Timestamp */
timestamp: Date;
/** Log level */
level: 'info' | 'warn' | 'error' | 'debug';
/** Log message */
message: string;
/** Additional structured data */
data?: Record<string, unknown>;
}
/**
* Browser session recording
*/
interface BrowserRecording {
/** Recording identifier */
recordingId: string;
/** Session this recording belongs to */
sessionId: string;
/** Recording format */
format: 'rrweb' | 'mp4' | string;
/** URL to access the recording */
url?: string;
/** Raw recording data */
data?: unknown;
}
/**
* Screenshot options
*/
interface ScreenshotOptions {
/** Image format */
format?: 'png' | 'jpeg' | 'webp';
/** Quality (0-100, for jpeg/webp) */
quality?: number;
/** Capture full scrollable page */
fullPage?: boolean;
/** CSS selector to capture */
selector?: string;
}
/**
* PDF generation options
*/
interface PdfOptions {
/** Paper format */
format?: 'letter' | 'legal' | 'a4' | 'a3';
/** Print background graphics */
printBackground?: boolean;
/** Landscape orientation */
landscape?: boolean;
}
/**
* Browser session manager — core lifecycle operations
*/
interface BrowserSessionManager<TSession = any> {
/** Create a new browser session */
create(options?: CreateBrowserSessionOptions): Promise<ProviderBrowserSession<TSession>>;
/** Get an existing session by ID */
getById(sessionId: string): Promise<ProviderBrowserSession<TSession> | null>;
/** List active sessions */
list(): Promise<ProviderBrowserSession<TSession>[]>;
/** Destroy/terminate a session */
destroy(sessionId: string): Promise<void>;
}
/**
* Browser profile manager
*/
interface BrowserProfileManager {
/** Create a new profile */
create(options?: CreateBrowserProfileOptions): Promise<BrowserProfile>;
/** Get an existing profile */
get(profileId: string): Promise<BrowserProfile | null>;
/** List profiles */
list(): Promise<BrowserProfile[]>;
/** Delete a profile */
delete(profileId: string): Promise<void>;
}
/**
* Browser extension manager
*/
interface BrowserExtensionManager {
/** Upload/create an extension */
create(options: CreateBrowserExtensionOptions): Promise<BrowserExtension>;
/** Get an extension by ID */
get(extensionId: string): Promise<BrowserExtension | null>;
/** Delete an extension */
delete(extensionId: string): Promise<void>;
}
/**
* Browser pool manager (pre-warmed instances)
*/
interface BrowserPoolManager<TSession = any> {
/** Create a new pool */
create(options: CreateBrowserPoolOptions): Promise<BrowserPool>;
/** Get pool by ID */
get(poolId: string): Promise<BrowserPool | null>;
/** List pools */
list(): Promise<BrowserPool[]>;
/** Acquire a browser from the pool */
acquire(poolId: string): Promise<ProviderBrowserSession<TSession>>;
/** Release a browser back to the pool */
release(poolId: string, sessionId: string): Promise<void>;
/** Delete a pool */
delete(poolId: string): Promise<void>;
}
/**
* Browser log manager
*/
interface BrowserLogManager {
/** Get logs for a session */
list(sessionId: string): Promise<BrowserLog[]>;
}
/**
* Browser recording manager
*/
interface BrowserRecordingManager {
/** Get recording for a session */
get(sessionId: string): Promise<BrowserRecording | null>;
}
/**
* Browser page operations — native browser control (optional, provider-dependent)
*/
interface BrowserPageOperations<TSession = any> {
/** Navigate to a URL */
navigate(session: TSession, url: string): Promise<void>;
/** Take a screenshot */
screenshot(session: TSession, options?: ScreenshotOptions): Promise<Uint8Array>;
/** Generate a PDF */
pdf?(session: TSession, options?: PdfOptions): Promise<Uint8Array>;
/** Evaluate JavaScript in the page context */
evaluate(session: TSession, script: string): Promise<unknown>;
/** Get the current page HTML */
getContent(session: TSession): Promise<string>;
}
/**
* Provider browser session — wraps raw session with provider methods
* Analogous to ProviderSandbox for sandbox providers.
*/
interface ProviderBrowserSession<TSession = any> extends BrowserSession {
/** Get the provider that created this session */
getProvider(): BrowserProvider<TSession>;
/** Get the native provider session instance */
getInstance(): TSession;
/** Destroy this session */
destroy(): Promise<void>;
/** Take a screenshot (delegates to provider page ops or throws) */
screenshot(options?: ScreenshotOptions): Promise<Uint8Array>;
/** Get session logs */
getLogs(): Promise<BrowserLog[]>;
/** Get session recording */
getRecording(): Promise<BrowserRecording | null>;
}
/**
* Browser provider interface — creates and manages browser sessions
*
* This is the top-level interface for browser providers, analogous to
* the Provider interface for sandbox providers.
*/
interface BrowserProvider<TSession = any> {
/** Provider name/type */
readonly name: string;
/** Session lifecycle management */
readonly session: BrowserSessionManager<TSession>;
/** Get CDP/WebSocket connection URL for a session */
getConnectUrl(sessionId: string): Promise<string>;
/** Optional profile management (Browserbase contexts, Kernel profiles) */
readonly profile?: BrowserProfileManager;
/** Optional extension management */
readonly extension?: BrowserExtensionManager;
/** Optional pool management (pre-warmed instances) */
readonly pool?: BrowserPoolManager<TSession>;
/** Optional log access */
readonly logs?: BrowserLogManager;
/** Optional recording access */
readonly recording?: BrowserRecordingManager;
/** Optional native page operations */
readonly page?: BrowserPageOperations<TSession>;
}
/**
* Provider Factory - Creates providers from method definitions

@@ -711,2 +1028,130 @@ *

/**
* Browser Provider Factory - Creates browser providers from method definitions
*
* Eliminates boilerplate by auto-generating BrowserProvider/Session classes
* from simple method definitions with automatic feature detection.
* Mirrors the sandbox provider factory pattern.
*/
/**
* Session method implementations that provider authors supply
*/
interface BrowserSessionMethods<TSession = any, TConfig = any> {
create: (config: TConfig, options?: CreateBrowserSessionOptions) => Promise<{
session: TSession;
sessionId: string;
connectUrl: string;
status?: BrowserSession['status'];
}>;
getById: (config: TConfig, sessionId: string) => Promise<{
session: TSession;
sessionId: string;
connectUrl: string;
status?: BrowserSession['status'];
} | null>;
list: (config: TConfig) => Promise<Array<{
session: TSession;
sessionId: string;
connectUrl: string;
status?: BrowserSession['status'];
}>>;
destroy: (config: TConfig, sessionId: string) => Promise<void>;
getConnectUrl: (config: TConfig, sessionId: string) => Promise<string>;
}
/**
* Profile method implementations
*/
interface BrowserProfileMethods<TConfig = any> {
create: (config: TConfig, options?: CreateBrowserProfileOptions) => Promise<BrowserProfile>;
get: (config: TConfig, profileId: string) => Promise<BrowserProfile | null>;
list: (config: TConfig) => Promise<BrowserProfile[]>;
delete: (config: TConfig, profileId: string) => Promise<void>;
}
/**
* Extension method implementations
*/
interface BrowserExtensionMethods<TConfig = any> {
create: (config: TConfig, options: CreateBrowserExtensionOptions) => Promise<BrowserExtension>;
get: (config: TConfig, extensionId: string) => Promise<BrowserExtension | null>;
delete: (config: TConfig, extensionId: string) => Promise<void>;
}
/**
* Pool method implementations
*/
interface BrowserPoolMethods<TSession = any, TConfig = any> {
create: (config: TConfig, options: CreateBrowserPoolOptions) => Promise<BrowserPool>;
get: (config: TConfig, poolId: string) => Promise<BrowserPool | null>;
list: (config: TConfig) => Promise<BrowserPool[]>;
acquire: (config: TConfig, poolId: string) => Promise<{
session: TSession;
sessionId: string;
connectUrl: string;
}>;
release: (config: TConfig, poolId: string, sessionId: string) => Promise<void>;
delete: (config: TConfig, poolId: string) => Promise<void>;
}
/**
* Log method implementations
*/
interface BrowserLogMethods<TConfig = any> {
list: (config: TConfig, sessionId: string) => Promise<BrowserLog[]>;
}
/**
* Recording method implementations
*/
interface BrowserRecordingMethods<TConfig = any> {
get: (config: TConfig, sessionId: string) => Promise<BrowserRecording | null>;
}
/**
* Page operation method implementations
*/
interface BrowserPageMethods<TSession = any> {
navigate: (session: TSession, url: string) => Promise<void>;
screenshot: (session: TSession, options?: ScreenshotOptions) => Promise<Uint8Array>;
pdf?: (session: TSession, options?: PdfOptions) => Promise<Uint8Array>;
evaluate: (session: TSession, script: string) => Promise<unknown>;
getContent: (session: TSession) => Promise<string>;
}
/**
* Full browser provider configuration for defineBrowserProvider()
*/
interface BrowserProviderConfig<TSession = any, TConfig = any> {
name: string;
methods: {
session: BrowserSessionMethods<TSession, TConfig>;
profile?: BrowserProfileMethods<TConfig>;
extension?: BrowserExtensionMethods<TConfig>;
pool?: BrowserPoolMethods<TSession, TConfig>;
logs?: BrowserLogMethods<TConfig>;
recording?: BrowserRecordingMethods<TConfig>;
page?: BrowserPageMethods<TSession>;
};
}
/**
* Create a browser provider from method definitions
*
* Auto-generates all boilerplate classes and provides feature detection
* based on which methods are implemented.
*
* @example
* ```ts
* export const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({
* name: 'browserbase',
* methods: {
* session: { create, getById, list, destroy, getConnectUrl },
* profile: { create, get, list, delete },
* logs: { list: getLogs },
* recording: { get: getRecording },
* },
* });
*
* // Usage:
* const provider = browserbase({ apiKey: 'bb_...' });
* const session = await provider.session.create({ stealth: true });
* console.log(session.connectUrl);
* ```
*/
declare function defineBrowserProvider<TSession, TConfig = any>(providerConfig: BrowserProviderConfig<TSession, TConfig>): (config: TConfig) => BrowserProvider<TSession>;
/**
* Utility functions for ComputeSDK

@@ -760,2 +1205,2 @@ */

export { type BlaxelProviderConfig, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type ComputeFactoryConfig, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaemonConfig, type DaytonaProviderConfig, type DownloadResult, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type InfraProvider, type InfraProviderConfig, type InfraProviderMethods, type ListOptions, type ListResult, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type Provider, type ProviderConfig, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type SnapshotMethods, type StorageObject, type StorageProvider, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type UploadOptions, type VercelProviderConfig, calculateBackoff, createCompute, defineCompute, defineInfraProvider, defineProvider, escapeShellArg };
export { type BlaxelProviderConfig, type BrowserExtension, type BrowserExtensionManager, type BrowserExtensionMethods, type BrowserLog, type BrowserLogManager, type BrowserLogMethods, type BrowserPageMethods, type BrowserPageOperations, type BrowserPool, type BrowserPoolManager, type BrowserPoolMethods, type BrowserProfile, type BrowserProfileManager, type BrowserProfileMethods, type BrowserProvider, type BrowserProviderConfig, type BrowserRecording, type BrowserRecordingManager, type BrowserRecordingMethods, type BrowserSession, type BrowserSessionManager, type BrowserSessionMethods, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type ComputeFactoryConfig, type CreateBrowserExtensionOptions, type CreateBrowserPoolOptions, type CreateBrowserProfileOptions, type CreateBrowserSessionOptions, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaemonConfig, type DaytonaProviderConfig, type DownloadResult, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type InfraProvider, type InfraProviderConfig, type InfraProviderMethods, type ListOptions, type ListResult, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type PdfOptions, type Provider, type ProviderBrowserSession, type ProviderConfig, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type ProxyConfig, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type ScreenshotOptions, type SnapshotMethods, type StorageObject, type StorageProvider, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type UploadOptions, type VercelProviderConfig, calculateBackoff, createCompute, defineBrowserProvider, defineCompute, defineInfraProvider, defineProvider, escapeShellArg };

@@ -409,2 +409,319 @@ import { CreateSandboxOptions, SandboxInterface, Runtime, CodeResult, RunCommandOptions, CommandResult, SandboxInfo, FileEntry, ExplicitComputeConfig, ProviderName, CallableCompute } from 'computesdk';

/**
* Browser Provider Types
*
* Types for browser providers (Browserbase, Kernel, etc.)
* Browser providers manage cloud browser sessions, distinct from sandbox providers
* which manage code execution environments.
*/
/**
* Browser session info returned from provider APIs
*/
interface BrowserSession {
/** Unique session identifier */
sessionId: string;
/** CDP or WebSocket connection URL */
connectUrl: string;
/** Current session status */
status: 'created' | 'running' | 'completed' | 'failed' | 'timed_out';
/** Session creation timestamp */
createdAt?: Date;
/** Provider-specific metadata */
metadata?: Record<string, unknown>;
}
/**
* Options for creating a browser session
*/
interface CreateBrowserSessionOptions {
/** Proxy configuration — true for provider default, or detailed config */
proxies?: boolean | ProxyConfig[];
/** Browser viewport dimensions */
viewport?: {
width: number;
height: number;
};
/** Session timeout in seconds */
timeout?: number;
/** Keep session alive after script disconnects */
keepAlive?: boolean;
/** Enable session recording (default: true) */
recording?: boolean;
/** Enable session logging (default: true) */
logging?: boolean;
/** Enable stealth/anti-detection mode */
stealth?: boolean;
/** Browser profile/context ID for session persistence */
profileId?: string;
/** Extension IDs to load */
extensionIds?: string[];
/** Region/datacenter preference */
region?: string;
/** Custom user metadata */
userMetadata?: Record<string, string>;
}
/**
* Proxy configuration for browser sessions
*/
interface ProxyConfig {
/** Proxy type */
type: 'residential' | 'isp' | 'datacenter' | 'custom';
/** Proxy server URL (for custom type) */
server?: string;
/** Proxy username */
username?: string;
/** Proxy password */
password?: string;
/** Geolocation targeting */
geolocation?: {
country?: string;
state?: string;
city?: string;
};
/** Domain pattern to route through this proxy */
domainPattern?: string;
}
/**
* Browser profile (persistent context — cookies, storage, etc.)
*/
interface BrowserProfile {
/** Unique profile identifier */
profileId: string;
/** Human-readable name */
name?: string;
/** Creation timestamp */
createdAt?: Date;
/** Provider-specific metadata */
metadata?: Record<string, unknown>;
}
/**
* Options for creating a browser profile
*/
interface CreateBrowserProfileOptions {
/** Human-readable name */
name?: string;
/** Custom metadata */
metadata?: Record<string, string>;
}
/**
* Browser extension
*/
interface BrowserExtension {
/** Unique extension identifier */
extensionId: string;
/** Extension name */
name?: string;
}
/**
* Options for uploading/creating a browser extension
*/
interface CreateBrowserExtensionOptions {
/** Extension file data */
file: Uint8Array | string;
/** Extension name */
name?: string;
}
/**
* Browser pool — pre-warmed browser instances for instant acquisition
*/
interface BrowserPool {
/** Unique pool identifier */
poolId: string;
/** Pool name */
name?: string;
/** Number of idle instances ready */
idleCount?: number;
/** Number of active instances in use */
activeCount?: number;
}
/**
* Options for creating a browser pool
*/
interface CreateBrowserPoolOptions {
/** Pool name */
name: string;
/** Desired number of pre-warmed instances */
size: number;
/** Default session options for pool instances */
sessionDefaults?: CreateBrowserSessionOptions;
}
/**
* Browser session log entry
*/
interface BrowserLog {
/** Timestamp */
timestamp: Date;
/** Log level */
level: 'info' | 'warn' | 'error' | 'debug';
/** Log message */
message: string;
/** Additional structured data */
data?: Record<string, unknown>;
}
/**
* Browser session recording
*/
interface BrowserRecording {
/** Recording identifier */
recordingId: string;
/** Session this recording belongs to */
sessionId: string;
/** Recording format */
format: 'rrweb' | 'mp4' | string;
/** URL to access the recording */
url?: string;
/** Raw recording data */
data?: unknown;
}
/**
* Screenshot options
*/
interface ScreenshotOptions {
/** Image format */
format?: 'png' | 'jpeg' | 'webp';
/** Quality (0-100, for jpeg/webp) */
quality?: number;
/** Capture full scrollable page */
fullPage?: boolean;
/** CSS selector to capture */
selector?: string;
}
/**
* PDF generation options
*/
interface PdfOptions {
/** Paper format */
format?: 'letter' | 'legal' | 'a4' | 'a3';
/** Print background graphics */
printBackground?: boolean;
/** Landscape orientation */
landscape?: boolean;
}
/**
* Browser session manager — core lifecycle operations
*/
interface BrowserSessionManager<TSession = any> {
/** Create a new browser session */
create(options?: CreateBrowserSessionOptions): Promise<ProviderBrowserSession<TSession>>;
/** Get an existing session by ID */
getById(sessionId: string): Promise<ProviderBrowserSession<TSession> | null>;
/** List active sessions */
list(): Promise<ProviderBrowserSession<TSession>[]>;
/** Destroy/terminate a session */
destroy(sessionId: string): Promise<void>;
}
/**
* Browser profile manager
*/
interface BrowserProfileManager {
/** Create a new profile */
create(options?: CreateBrowserProfileOptions): Promise<BrowserProfile>;
/** Get an existing profile */
get(profileId: string): Promise<BrowserProfile | null>;
/** List profiles */
list(): Promise<BrowserProfile[]>;
/** Delete a profile */
delete(profileId: string): Promise<void>;
}
/**
* Browser extension manager
*/
interface BrowserExtensionManager {
/** Upload/create an extension */
create(options: CreateBrowserExtensionOptions): Promise<BrowserExtension>;
/** Get an extension by ID */
get(extensionId: string): Promise<BrowserExtension | null>;
/** Delete an extension */
delete(extensionId: string): Promise<void>;
}
/**
* Browser pool manager (pre-warmed instances)
*/
interface BrowserPoolManager<TSession = any> {
/** Create a new pool */
create(options: CreateBrowserPoolOptions): Promise<BrowserPool>;
/** Get pool by ID */
get(poolId: string): Promise<BrowserPool | null>;
/** List pools */
list(): Promise<BrowserPool[]>;
/** Acquire a browser from the pool */
acquire(poolId: string): Promise<ProviderBrowserSession<TSession>>;
/** Release a browser back to the pool */
release(poolId: string, sessionId: string): Promise<void>;
/** Delete a pool */
delete(poolId: string): Promise<void>;
}
/**
* Browser log manager
*/
interface BrowserLogManager {
/** Get logs for a session */
list(sessionId: string): Promise<BrowserLog[]>;
}
/**
* Browser recording manager
*/
interface BrowserRecordingManager {
/** Get recording for a session */
get(sessionId: string): Promise<BrowserRecording | null>;
}
/**
* Browser page operations — native browser control (optional, provider-dependent)
*/
interface BrowserPageOperations<TSession = any> {
/** Navigate to a URL */
navigate(session: TSession, url: string): Promise<void>;
/** Take a screenshot */
screenshot(session: TSession, options?: ScreenshotOptions): Promise<Uint8Array>;
/** Generate a PDF */
pdf?(session: TSession, options?: PdfOptions): Promise<Uint8Array>;
/** Evaluate JavaScript in the page context */
evaluate(session: TSession, script: string): Promise<unknown>;
/** Get the current page HTML */
getContent(session: TSession): Promise<string>;
}
/**
* Provider browser session — wraps raw session with provider methods
* Analogous to ProviderSandbox for sandbox providers.
*/
interface ProviderBrowserSession<TSession = any> extends BrowserSession {
/** Get the provider that created this session */
getProvider(): BrowserProvider<TSession>;
/** Get the native provider session instance */
getInstance(): TSession;
/** Destroy this session */
destroy(): Promise<void>;
/** Take a screenshot (delegates to provider page ops or throws) */
screenshot(options?: ScreenshotOptions): Promise<Uint8Array>;
/** Get session logs */
getLogs(): Promise<BrowserLog[]>;
/** Get session recording */
getRecording(): Promise<BrowserRecording | null>;
}
/**
* Browser provider interface — creates and manages browser sessions
*
* This is the top-level interface for browser providers, analogous to
* the Provider interface for sandbox providers.
*/
interface BrowserProvider<TSession = any> {
/** Provider name/type */
readonly name: string;
/** Session lifecycle management */
readonly session: BrowserSessionManager<TSession>;
/** Get CDP/WebSocket connection URL for a session */
getConnectUrl(sessionId: string): Promise<string>;
/** Optional profile management (Browserbase contexts, Kernel profiles) */
readonly profile?: BrowserProfileManager;
/** Optional extension management */
readonly extension?: BrowserExtensionManager;
/** Optional pool management (pre-warmed instances) */
readonly pool?: BrowserPoolManager<TSession>;
/** Optional log access */
readonly logs?: BrowserLogManager;
/** Optional recording access */
readonly recording?: BrowserRecordingManager;
/** Optional native page operations */
readonly page?: BrowserPageOperations<TSession>;
}
/**
* Provider Factory - Creates providers from method definitions

@@ -711,2 +1028,130 @@ *

/**
* Browser Provider Factory - Creates browser providers from method definitions
*
* Eliminates boilerplate by auto-generating BrowserProvider/Session classes
* from simple method definitions with automatic feature detection.
* Mirrors the sandbox provider factory pattern.
*/
/**
* Session method implementations that provider authors supply
*/
interface BrowserSessionMethods<TSession = any, TConfig = any> {
create: (config: TConfig, options?: CreateBrowserSessionOptions) => Promise<{
session: TSession;
sessionId: string;
connectUrl: string;
status?: BrowserSession['status'];
}>;
getById: (config: TConfig, sessionId: string) => Promise<{
session: TSession;
sessionId: string;
connectUrl: string;
status?: BrowserSession['status'];
} | null>;
list: (config: TConfig) => Promise<Array<{
session: TSession;
sessionId: string;
connectUrl: string;
status?: BrowserSession['status'];
}>>;
destroy: (config: TConfig, sessionId: string) => Promise<void>;
getConnectUrl: (config: TConfig, sessionId: string) => Promise<string>;
}
/**
* Profile method implementations
*/
interface BrowserProfileMethods<TConfig = any> {
create: (config: TConfig, options?: CreateBrowserProfileOptions) => Promise<BrowserProfile>;
get: (config: TConfig, profileId: string) => Promise<BrowserProfile | null>;
list: (config: TConfig) => Promise<BrowserProfile[]>;
delete: (config: TConfig, profileId: string) => Promise<void>;
}
/**
* Extension method implementations
*/
interface BrowserExtensionMethods<TConfig = any> {
create: (config: TConfig, options: CreateBrowserExtensionOptions) => Promise<BrowserExtension>;
get: (config: TConfig, extensionId: string) => Promise<BrowserExtension | null>;
delete: (config: TConfig, extensionId: string) => Promise<void>;
}
/**
* Pool method implementations
*/
interface BrowserPoolMethods<TSession = any, TConfig = any> {
create: (config: TConfig, options: CreateBrowserPoolOptions) => Promise<BrowserPool>;
get: (config: TConfig, poolId: string) => Promise<BrowserPool | null>;
list: (config: TConfig) => Promise<BrowserPool[]>;
acquire: (config: TConfig, poolId: string) => Promise<{
session: TSession;
sessionId: string;
connectUrl: string;
}>;
release: (config: TConfig, poolId: string, sessionId: string) => Promise<void>;
delete: (config: TConfig, poolId: string) => Promise<void>;
}
/**
* Log method implementations
*/
interface BrowserLogMethods<TConfig = any> {
list: (config: TConfig, sessionId: string) => Promise<BrowserLog[]>;
}
/**
* Recording method implementations
*/
interface BrowserRecordingMethods<TConfig = any> {
get: (config: TConfig, sessionId: string) => Promise<BrowserRecording | null>;
}
/**
* Page operation method implementations
*/
interface BrowserPageMethods<TSession = any> {
navigate: (session: TSession, url: string) => Promise<void>;
screenshot: (session: TSession, options?: ScreenshotOptions) => Promise<Uint8Array>;
pdf?: (session: TSession, options?: PdfOptions) => Promise<Uint8Array>;
evaluate: (session: TSession, script: string) => Promise<unknown>;
getContent: (session: TSession) => Promise<string>;
}
/**
* Full browser provider configuration for defineBrowserProvider()
*/
interface BrowserProviderConfig<TSession = any, TConfig = any> {
name: string;
methods: {
session: BrowserSessionMethods<TSession, TConfig>;
profile?: BrowserProfileMethods<TConfig>;
extension?: BrowserExtensionMethods<TConfig>;
pool?: BrowserPoolMethods<TSession, TConfig>;
logs?: BrowserLogMethods<TConfig>;
recording?: BrowserRecordingMethods<TConfig>;
page?: BrowserPageMethods<TSession>;
};
}
/**
* Create a browser provider from method definitions
*
* Auto-generates all boilerplate classes and provides feature detection
* based on which methods are implemented.
*
* @example
* ```ts
* export const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({
* name: 'browserbase',
* methods: {
* session: { create, getById, list, destroy, getConnectUrl },
* profile: { create, get, list, delete },
* logs: { list: getLogs },
* recording: { get: getRecording },
* },
* });
*
* // Usage:
* const provider = browserbase({ apiKey: 'bb_...' });
* const session = await provider.session.create({ stealth: true });
* console.log(session.connectUrl);
* ```
*/
declare function defineBrowserProvider<TSession, TConfig = any>(providerConfig: BrowserProviderConfig<TSession, TConfig>): (config: TConfig) => BrowserProvider<TSession>;
/**
* Utility functions for ComputeSDK

@@ -760,2 +1205,2 @@ */

export { type BlaxelProviderConfig, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type ComputeFactoryConfig, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaemonConfig, type DaytonaProviderConfig, type DownloadResult, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type InfraProvider, type InfraProviderConfig, type InfraProviderMethods, type ListOptions, type ListResult, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type Provider, type ProviderConfig, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type SnapshotMethods, type StorageObject, type StorageProvider, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type UploadOptions, type VercelProviderConfig, calculateBackoff, createCompute, defineCompute, defineInfraProvider, defineProvider, escapeShellArg };
export { type BlaxelProviderConfig, type BrowserExtension, type BrowserExtensionManager, type BrowserExtensionMethods, type BrowserLog, type BrowserLogManager, type BrowserLogMethods, type BrowserPageMethods, type BrowserPageOperations, type BrowserPool, type BrowserPoolManager, type BrowserPoolMethods, type BrowserProfile, type BrowserProfileManager, type BrowserProfileMethods, type BrowserProvider, type BrowserProviderConfig, type BrowserRecording, type BrowserRecordingManager, type BrowserRecordingMethods, type BrowserSession, type BrowserSessionManager, type BrowserSessionMethods, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type ComputeFactoryConfig, type CreateBrowserExtensionOptions, type CreateBrowserPoolOptions, type CreateBrowserProfileOptions, type CreateBrowserSessionOptions, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaemonConfig, type DaytonaProviderConfig, type DownloadResult, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type InfraProvider, type InfraProviderConfig, type InfraProviderMethods, type ListOptions, type ListResult, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type PdfOptions, type Provider, type ProviderBrowserSession, type ProviderConfig, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type ProxyConfig, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type ScreenshotOptions, type SnapshotMethods, type StorageObject, type StorageProvider, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type UploadOptions, type VercelProviderConfig, calculateBackoff, createCompute, defineBrowserProvider, defineCompute, defineInfraProvider, defineProvider, escapeShellArg };

@@ -25,2 +25,3 @@ "use strict";

createCompute: () => createCompute,
defineBrowserProvider: () => defineBrowserProvider,
defineCompute: () => defineCompute,

@@ -83,3 +84,3 @@ defineInfraProvider: () => defineInfraProvider,

var GeneratedSandbox = class {
constructor(sandbox, sandboxId, providerName, methods, config, destroyMethod, providerInstance) {
constructor(sandbox, sandboxId, providerName, methods, config, destroyMethod, providerInstance, defaultRuntime) {
this.sandbox = sandbox;

@@ -92,2 +93,3 @@ this.methods = methods;

this.provider = providerName;
this.defaultRuntime = defaultRuntime;
if (methods.filesystem) {

@@ -106,3 +108,3 @@ this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);

async runCode(code, runtime) {
return await this.methods.runCode(this.sandbox, code, runtime, this.config);
return await this.methods.runCode(this.sandbox, code, runtime ?? this.defaultRuntime, this.config);
}

@@ -142,3 +144,4 @@ async runCommand(command, options) {

this.methods.destroy,
this.providerInstance
this.providerInstance,
options?.runtime
);

@@ -337,2 +340,253 @@ }

// src/browser-factory.ts
var GeneratedBrowserSession = class {
constructor(session, sessionId, connectUrl, status, providerInstance, config, sessionMethods, logMethods, recordingMethods, pageMethods) {
this.session = session;
this.providerInstance = providerInstance;
this.config = config;
this.sessionMethods = sessionMethods;
this.logMethods = logMethods;
this.recordingMethods = recordingMethods;
this.pageMethods = pageMethods;
this.sessionId = sessionId;
this.connectUrl = connectUrl;
this.status = status ?? "running";
}
getInstance() {
return this.session;
}
getProvider() {
return this.providerInstance;
}
async destroy() {
await this.sessionMethods.destroy(this.config, this.sessionId);
}
async screenshot(options) {
if (!this.pageMethods) {
throw new Error(
`Provider '${this.providerInstance.name}' does not support native page operations. Use the connectUrl to control the browser via Playwright/Puppeteer instead.`
);
}
return this.pageMethods.screenshot(this.session, options);
}
async getLogs() {
if (!this.logMethods) {
throw new Error(`Provider '${this.providerInstance.name}' does not support log retrieval.`);
}
return this.logMethods.list(this.config, this.sessionId);
}
async getRecording() {
if (!this.recordingMethods) {
throw new Error(`Provider '${this.providerInstance.name}' does not support recordings.`);
}
return this.recordingMethods.get(this.config, this.sessionId);
}
};
var GeneratedSessionManager = class {
constructor(config, methods, providerInstance, logMethods, recordingMethods, pageMethods) {
this.config = config;
this.methods = methods;
this.providerInstance = providerInstance;
this.logMethods = logMethods;
this.recordingMethods = recordingMethods;
this.pageMethods = pageMethods;
}
async create(options) {
const result = await this.methods.create(this.config, options);
return new GeneratedBrowserSession(
result.session,
result.sessionId,
result.connectUrl,
result.status,
this.providerInstance,
this.config,
this.methods,
this.logMethods,
this.recordingMethods,
this.pageMethods
);
}
async getById(sessionId) {
const result = await this.methods.getById(this.config, sessionId);
if (!result) return null;
return new GeneratedBrowserSession(
result.session,
result.sessionId,
result.connectUrl,
result.status,
this.providerInstance,
this.config,
this.methods,
this.logMethods,
this.recordingMethods,
this.pageMethods
);
}
async list() {
const results = await this.methods.list(this.config);
return results.map((r) => new GeneratedBrowserSession(
r.session,
r.sessionId,
r.connectUrl,
r.status,
this.providerInstance,
this.config,
this.methods,
this.logMethods,
this.recordingMethods,
this.pageMethods
));
}
async destroy(sessionId) {
await this.methods.destroy(this.config, sessionId);
}
};
var GeneratedProfileManager = class {
constructor(config, methods) {
this.config = config;
this.methods = methods;
}
async create(options) {
return this.methods.create(this.config, options);
}
async get(profileId) {
return this.methods.get(this.config, profileId);
}
async list() {
return this.methods.list(this.config);
}
async delete(profileId) {
return this.methods.delete(this.config, profileId);
}
};
var GeneratedExtensionManager = class {
constructor(config, methods) {
this.config = config;
this.methods = methods;
}
async create(options) {
return this.methods.create(this.config, options);
}
async get(extensionId) {
return this.methods.get(this.config, extensionId);
}
async delete(extensionId) {
return this.methods.delete(this.config, extensionId);
}
};
var GeneratedPoolManager = class {
constructor(config, methods, providerInstance, sessionMethods, logMethods, recordingMethods, pageMethods) {
this.config = config;
this.methods = methods;
this.providerInstance = providerInstance;
this.sessionMethods = sessionMethods;
this.logMethods = logMethods;
this.recordingMethods = recordingMethods;
this.pageMethods = pageMethods;
}
async create(options) {
return this.methods.create(this.config, options);
}
async get(poolId) {
return this.methods.get(this.config, poolId);
}
async list() {
return this.methods.list(this.config);
}
async acquire(poolId) {
const result = await this.methods.acquire(this.config, poolId);
return new GeneratedBrowserSession(
result.session,
result.sessionId,
result.connectUrl,
"running",
this.providerInstance,
this.config,
this.sessionMethods,
this.logMethods,
this.recordingMethods,
this.pageMethods
);
}
async release(poolId, sessionId) {
return this.methods.release(this.config, poolId, sessionId);
}
async delete(poolId) {
return this.methods.delete(this.config, poolId);
}
};
var GeneratedPageOperations = class {
constructor(methods) {
this.methods = methods;
if (methods.pdf) {
const pdfMethod = methods.pdf;
this.pdf = (session, options) => pdfMethod(session, options);
}
}
async navigate(session, url) {
return this.methods.navigate(session, url);
}
async screenshot(session, options) {
return this.methods.screenshot(session, options);
}
async evaluate(session, script) {
return this.methods.evaluate(session, script);
}
async getContent(session) {
return this.methods.getContent(session);
}
};
var GeneratedBrowserProvider = class {
constructor(config, providerConfig) {
this.name = providerConfig.name;
this.config = config;
this.sessionMethods = providerConfig.methods.session;
const logMethods = providerConfig.methods.logs;
const recordingMethods = providerConfig.methods.recording;
const pageMethods = providerConfig.methods.page;
this.session = new GeneratedSessionManager(
config,
providerConfig.methods.session,
this,
logMethods,
recordingMethods,
pageMethods
);
if (providerConfig.methods.profile) {
this.profile = new GeneratedProfileManager(config, providerConfig.methods.profile);
}
if (providerConfig.methods.extension) {
this.extension = new GeneratedExtensionManager(config, providerConfig.methods.extension);
}
if (providerConfig.methods.pool) {
this.pool = new GeneratedPoolManager(
config,
providerConfig.methods.pool,
this,
providerConfig.methods.session,
logMethods,
recordingMethods,
pageMethods
);
}
if (logMethods) {
this.logs = { list: (sessionId) => logMethods.list(config, sessionId) };
}
if (recordingMethods) {
this.recording = { get: (sessionId) => recordingMethods.get(config, sessionId) };
}
if (pageMethods) {
this.page = new GeneratedPageOperations(pageMethods);
}
}
async getConnectUrl(sessionId) {
return this.sessionMethods.getConnectUrl(this.config, sessionId);
}
};
function defineBrowserProvider(providerConfig) {
return (config) => {
return new GeneratedBrowserProvider(config, providerConfig);
};
}
// src/utils.ts

@@ -349,2 +603,3 @@ function calculateBackoff(attempt, baseDelay = 1e3, jitterMax = 100) {

createCompute,
defineBrowserProvider,
defineCompute,

@@ -351,0 +606,0 @@ defineInfraProvider,

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/factory.ts","../src/infra-factory.ts","../src/compute-factory.ts","../src/compute.ts","../src/utils.ts"],"sourcesContent":["/**\n * @computesdk/provider - Provider Framework\n * \n * Build custom sandbox providers for ComputeSDK.\n * This package provides the factory and types needed to create providers.\n */\n\n// Export factories\nexport { defineProvider } from './factory';\nexport type { \n ProviderConfig, \n SandboxMethods, \n TemplateMethods, \n SnapshotMethods\n} from './factory';\n\nexport { defineInfraProvider } from './infra-factory';\nexport type {\n InfraProviderConfig,\n InfraProviderMethods,\n InfraProvider,\n DaemonConfig\n} from './infra-factory';\n\nexport { defineCompute } from './compute-factory';\nexport type {\n ComputeFactoryConfig,\n ComputeConfig\n} from './compute-factory';\n\n// Export direct mode compute API\nexport { createCompute } from './compute';\nexport type { CreateComputeConfig, ComputeAPI } from './compute';\n\n// Export utilities\nexport { calculateBackoff, escapeShellArg } from './utils';\n\n// Export all types\nexport type * from './types';\n","/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Infrastructure Provider Factory\n * \n * Creates infrastructure-only providers that provision compute resources\n * but don't have native sandbox capabilities. Used by gateway server.\n */\n\nimport type { CreateSandboxOptions } from './types/index.js';\n\n/**\n * Infrastructure provider methods - only resource provisioning\n */\nexport interface InfraProviderMethods<TInstance = any, TConfig = any> {\n /** Create a new compute instance */\n create: (config: TConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n \n /** Get an existing instance by ID */\n getById: (config: TConfig, instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n \n /** List all instances */\n list: (config: TConfig) => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n \n /** Destroy an instance */\n destroy: (config: TConfig, instanceId: string) => Promise<void>;\n}\n\n/**\n * Daemon configuration passed to infrastructure providers\n */\nexport interface DaemonConfig {\n /** Access token for daemon authentication */\n accessToken: string;\n /** Gateway URL for daemon to connect to */\n gatewayUrl?: string;\n /** Additional daemon environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Infrastructure provider configuration\n */\nexport interface InfraProviderConfig<TInstance = any, TConfig = any> {\n name: string;\n methods: InfraProviderMethods<TInstance, TConfig>;\n}\n\n/**\n * Infrastructure provider interface returned by defineInfraProvider\n */\nexport interface InfraProvider<TInstance = any> {\n name: string;\n create: (options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n getById: (instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n list: () => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n destroy: (instanceId: string) => Promise<void>;\n}\n\n/**\n * Create an infrastructure provider from method definitions\n * \n * Infrastructure providers only handle resource provisioning.\n * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.\n * \n * @example\n * ```typescript\n * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n * name: 'railway',\n * methods: {\n * create: async (config, options) => {\n * // Create Railway service with daemon docker image\n * const service = await railwayAPI.createService({\n * ...config,\n * image: 'computesdk/daemon:latest',\n * env: options?.daemonConfig ? {\n * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,\n * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,\n * } : {}\n * });\n * return { instance: service, instanceId: service.id };\n * },\n * destroy: async (config, instanceId) => {\n * await railwayAPI.deleteService(config, instanceId);\n * },\n * getById: async (config, instanceId) => {\n * const service = await railwayAPI.getService(config, instanceId);\n * return service ? { instance: service, instanceId: service.id } : null;\n * },\n * list: async (config) => {\n * const services = await railwayAPI.listServices(config);\n * return services.map(s => ({ instance: s, instanceId: s.id }));\n * }\n * }\n * });\n * \n * // Gateway server usage:\n * const provider = railway({ apiKey, projectId, environmentId });\n * const { instance, instanceId } = await provider.create({\n * daemonConfig: { accessToken: 'token_xxx' }\n * });\n * ```\n */\nexport function defineInfraProvider<TInstance, TConfig = any>(\n config: InfraProviderConfig<TInstance, TConfig>\n): (providerConfig: TConfig) => InfraProvider<TInstance> {\n return (providerConfig: TConfig) => {\n return {\n name: config.name,\n \n create: async (options) => {\n return await config.methods.create(providerConfig, options);\n },\n \n getById: async (instanceId) => {\n return await config.methods.getById(providerConfig, instanceId);\n },\n \n list: async () => {\n return await config.methods.list(providerConfig);\n },\n \n destroy: async (instanceId) => {\n await config.methods.destroy(providerConfig, instanceId);\n }\n };\n };\n}\n","/**\n * Compute Factory\n *\n * Creates compute instance factories for infrastructure providers.\n * Allows providers like Railway to feel like first-class citizens while\n * routing through the gateway.\n */\n\nimport { compute, type CallableCompute, type ExplicitComputeConfig, type ProviderName } from 'computesdk';\n\n/**\n * Compute factory configuration\n */\nexport interface ComputeFactoryConfig {\n /** Provider name (must match gateway provider name) */\n provider: ProviderName;\n}\n\n/**\n * Base config for compute factories.\n * Omits 'provider' since that's set by the factory, not the user.\n */\nexport type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;\n\n/**\n * Create a compute instance factory for infrastructure providers\n *\n * This allows infrastructure providers like Railway to have their own\n * packages while routing through the gateway. Returns a function that\n * creates pre-configured compute instances.\n *\n * **Note:** This configures the global `compute` singleton. The returned\n * instance shares global state - calling this multiple times with different\n * configs will override previous configurations. This is intentional as\n * the compute singleton is designed to be configured once per application.\n *\n * @example\n * ```typescript\n * // Define Railway compute factory\n * export const railway = defineCompute<RailwayConfig>({\n * provider: 'railway'\n * });\n *\n * // User code:\n * import { railway } from '@computesdk/railway';\n *\n * const compute = railway({\n * apiKey: 'railway_xxx',\n * projectId: 'project_xxx',\n * environmentId: 'env_xxx'\n * });\n *\n * // Full compute API available\n * const sandbox = await compute.sandbox.create();\n * await sandbox.runCode('console.log(\"hello\")');\n * ```\n */\nexport function defineCompute<TConfig extends ComputeConfig>(\n factoryConfig: ComputeFactoryConfig\n): (config: TConfig) => CallableCompute {\n return (config: TConfig) => {\n compute.setConfig({\n ...config,\n provider: factoryConfig.provider,\n });\n return compute;\n };\n}\n","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}
{"version":3,"sources":["../src/index.ts","../src/factory.ts","../src/infra-factory.ts","../src/compute-factory.ts","../src/compute.ts","../src/browser-factory.ts","../src/utils.ts"],"sourcesContent":["/**\n * @computesdk/provider - Provider Framework\n * \n * Build custom sandbox providers for ComputeSDK.\n * This package provides the factory and types needed to create providers.\n */\n\n// Export factories\nexport { defineProvider } from './factory';\nexport type { \n ProviderConfig, \n SandboxMethods, \n TemplateMethods, \n SnapshotMethods\n} from './factory';\n\nexport { defineInfraProvider } from './infra-factory';\nexport type {\n InfraProviderConfig,\n InfraProviderMethods,\n InfraProvider,\n DaemonConfig\n} from './infra-factory';\n\nexport { defineCompute } from './compute-factory';\nexport type {\n ComputeFactoryConfig,\n ComputeConfig\n} from './compute-factory';\n\n// Export direct mode compute API\nexport { createCompute } from './compute';\nexport type { CreateComputeConfig, ComputeAPI } from './compute';\n\n// Export browser provider factory\nexport { defineBrowserProvider } from './browser-factory';\nexport type {\n BrowserProviderConfig,\n BrowserSessionMethods,\n BrowserProfileMethods,\n BrowserExtensionMethods,\n BrowserPoolMethods,\n BrowserLogMethods,\n BrowserRecordingMethods,\n BrowserPageMethods,\n} from './browser-factory';\n\n// Export utilities\nexport { calculateBackoff, escapeShellArg } from './utils';\n\n// Export all types\nexport type * from './types';\n","/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n private defaultRuntime?: Runtime;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider,\n defaultRuntime?: Runtime\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n this.defaultRuntime = defaultRuntime;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime ?? this.defaultRuntime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance,\n options?.runtime\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Infrastructure Provider Factory\n * \n * Creates infrastructure-only providers that provision compute resources\n * but don't have native sandbox capabilities. Used by gateway server.\n */\n\nimport type { CreateSandboxOptions } from './types/index.js';\n\n/**\n * Infrastructure provider methods - only resource provisioning\n */\nexport interface InfraProviderMethods<TInstance = any, TConfig = any> {\n /** Create a new compute instance */\n create: (config: TConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n \n /** Get an existing instance by ID */\n getById: (config: TConfig, instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n \n /** List all instances */\n list: (config: TConfig) => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n \n /** Destroy an instance */\n destroy: (config: TConfig, instanceId: string) => Promise<void>;\n}\n\n/**\n * Daemon configuration passed to infrastructure providers\n */\nexport interface DaemonConfig {\n /** Access token for daemon authentication */\n accessToken: string;\n /** Gateway URL for daemon to connect to */\n gatewayUrl?: string;\n /** Additional daemon environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Infrastructure provider configuration\n */\nexport interface InfraProviderConfig<TInstance = any, TConfig = any> {\n name: string;\n methods: InfraProviderMethods<TInstance, TConfig>;\n}\n\n/**\n * Infrastructure provider interface returned by defineInfraProvider\n */\nexport interface InfraProvider<TInstance = any> {\n name: string;\n create: (options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n getById: (instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n list: () => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n destroy: (instanceId: string) => Promise<void>;\n}\n\n/**\n * Create an infrastructure provider from method definitions\n * \n * Infrastructure providers only handle resource provisioning.\n * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.\n * \n * @example\n * ```typescript\n * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n * name: 'railway',\n * methods: {\n * create: async (config, options) => {\n * // Create Railway service with daemon docker image\n * const service = await railwayAPI.createService({\n * ...config,\n * image: 'computesdk/daemon:latest',\n * env: options?.daemonConfig ? {\n * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,\n * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,\n * } : {}\n * });\n * return { instance: service, instanceId: service.id };\n * },\n * destroy: async (config, instanceId) => {\n * await railwayAPI.deleteService(config, instanceId);\n * },\n * getById: async (config, instanceId) => {\n * const service = await railwayAPI.getService(config, instanceId);\n * return service ? { instance: service, instanceId: service.id } : null;\n * },\n * list: async (config) => {\n * const services = await railwayAPI.listServices(config);\n * return services.map(s => ({ instance: s, instanceId: s.id }));\n * }\n * }\n * });\n * \n * // Gateway server usage:\n * const provider = railway({ apiKey, projectId, environmentId });\n * const { instance, instanceId } = await provider.create({\n * daemonConfig: { accessToken: 'token_xxx' }\n * });\n * ```\n */\nexport function defineInfraProvider<TInstance, TConfig = any>(\n config: InfraProviderConfig<TInstance, TConfig>\n): (providerConfig: TConfig) => InfraProvider<TInstance> {\n return (providerConfig: TConfig) => {\n return {\n name: config.name,\n \n create: async (options) => {\n return await config.methods.create(providerConfig, options);\n },\n \n getById: async (instanceId) => {\n return await config.methods.getById(providerConfig, instanceId);\n },\n \n list: async () => {\n return await config.methods.list(providerConfig);\n },\n \n destroy: async (instanceId) => {\n await config.methods.destroy(providerConfig, instanceId);\n }\n };\n };\n}\n","/**\n * Compute Factory\n *\n * Creates compute instance factories for infrastructure providers.\n * Allows providers like Railway to feel like first-class citizens while\n * routing through the gateway.\n */\n\nimport { compute, type CallableCompute, type ExplicitComputeConfig, type ProviderName } from 'computesdk';\n\n/**\n * Compute factory configuration\n */\nexport interface ComputeFactoryConfig {\n /** Provider name (must match gateway provider name) */\n provider: ProviderName;\n}\n\n/**\n * Base config for compute factories.\n * Omits 'provider' since that's set by the factory, not the user.\n */\nexport type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;\n\n/**\n * Create a compute instance factory for infrastructure providers\n *\n * This allows infrastructure providers like Railway to have their own\n * packages while routing through the gateway. Returns a function that\n * creates pre-configured compute instances.\n *\n * **Note:** This configures the global `compute` singleton. The returned\n * instance shares global state - calling this multiple times with different\n * configs will override previous configurations. This is intentional as\n * the compute singleton is designed to be configured once per application.\n *\n * @example\n * ```typescript\n * // Define Railway compute factory\n * export const railway = defineCompute<RailwayConfig>({\n * provider: 'railway'\n * });\n *\n * // User code:\n * import { railway } from '@computesdk/railway';\n *\n * const compute = railway({\n * apiKey: 'railway_xxx',\n * projectId: 'project_xxx',\n * environmentId: 'env_xxx'\n * });\n *\n * // Full compute API available\n * const sandbox = await compute.sandbox.create();\n * await sandbox.runCode('console.log(\"hello\")');\n * ```\n */\nexport function defineCompute<TConfig extends ComputeConfig>(\n factoryConfig: ComputeFactoryConfig\n): (config: TConfig) => CallableCompute {\n return (config: TConfig) => {\n compute.setConfig({\n ...config,\n provider: factoryConfig.provider,\n });\n return compute;\n };\n}\n","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Browser Provider Factory - Creates browser providers from method definitions\n *\n * Eliminates boilerplate by auto-generating BrowserProvider/Session classes\n * from simple method definitions with automatic feature detection.\n * Mirrors the sandbox provider factory pattern.\n */\n\nimport type {\n BrowserProvider,\n BrowserSessionManager,\n BrowserProfileManager,\n BrowserExtensionManager,\n BrowserPoolManager,\n BrowserLogManager,\n BrowserRecordingManager,\n BrowserPageOperations,\n ProviderBrowserSession,\n BrowserSession,\n BrowserProfile,\n BrowserExtension,\n BrowserPool,\n BrowserLog,\n BrowserRecording,\n CreateBrowserSessionOptions,\n CreateBrowserProfileOptions,\n CreateBrowserExtensionOptions,\n CreateBrowserPoolOptions,\n ScreenshotOptions,\n PdfOptions,\n} from './types/browser.js';\n\n// ─── Method Definitions ──────────────────────────────────────────────────────\n\n/**\n * Session method implementations that provider authors supply\n */\nexport interface BrowserSessionMethods<TSession = any, TConfig = any> {\n create: (config: TConfig, options?: CreateBrowserSessionOptions) => Promise<{ session: TSession; sessionId: string; connectUrl: string; status?: BrowserSession['status'] }>;\n getById: (config: TConfig, sessionId: string) => Promise<{ session: TSession; sessionId: string; connectUrl: string; status?: BrowserSession['status'] } | null>;\n list: (config: TConfig) => Promise<Array<{ session: TSession; sessionId: string; connectUrl: string; status?: BrowserSession['status'] }>>;\n destroy: (config: TConfig, sessionId: string) => Promise<void>;\n getConnectUrl: (config: TConfig, sessionId: string) => Promise<string>;\n}\n\n/**\n * Profile method implementations\n */\nexport interface BrowserProfileMethods<TConfig = any> {\n create: (config: TConfig, options?: CreateBrowserProfileOptions) => Promise<BrowserProfile>;\n get: (config: TConfig, profileId: string) => Promise<BrowserProfile | null>;\n list: (config: TConfig) => Promise<BrowserProfile[]>;\n delete: (config: TConfig, profileId: string) => Promise<void>;\n}\n\n/**\n * Extension method implementations\n */\nexport interface BrowserExtensionMethods<TConfig = any> {\n create: (config: TConfig, options: CreateBrowserExtensionOptions) => Promise<BrowserExtension>;\n get: (config: TConfig, extensionId: string) => Promise<BrowserExtension | null>;\n delete: (config: TConfig, extensionId: string) => Promise<void>;\n}\n\n/**\n * Pool method implementations\n */\nexport interface BrowserPoolMethods<TSession = any, TConfig = any> {\n create: (config: TConfig, options: CreateBrowserPoolOptions) => Promise<BrowserPool>;\n get: (config: TConfig, poolId: string) => Promise<BrowserPool | null>;\n list: (config: TConfig) => Promise<BrowserPool[]>;\n acquire: (config: TConfig, poolId: string) => Promise<{ session: TSession; sessionId: string; connectUrl: string }>;\n release: (config: TConfig, poolId: string, sessionId: string) => Promise<void>;\n delete: (config: TConfig, poolId: string) => Promise<void>;\n}\n\n/**\n * Log method implementations\n */\nexport interface BrowserLogMethods<TConfig = any> {\n list: (config: TConfig, sessionId: string) => Promise<BrowserLog[]>;\n}\n\n/**\n * Recording method implementations\n */\nexport interface BrowserRecordingMethods<TConfig = any> {\n get: (config: TConfig, sessionId: string) => Promise<BrowserRecording | null>;\n}\n\n/**\n * Page operation method implementations\n */\nexport interface BrowserPageMethods<TSession = any> {\n navigate: (session: TSession, url: string) => Promise<void>;\n screenshot: (session: TSession, options?: ScreenshotOptions) => Promise<Uint8Array>;\n pdf?: (session: TSession, options?: PdfOptions) => Promise<Uint8Array>;\n evaluate: (session: TSession, script: string) => Promise<unknown>;\n getContent: (session: TSession) => Promise<string>;\n}\n\n/**\n * Full browser provider configuration for defineBrowserProvider()\n */\nexport interface BrowserProviderConfig<TSession = any, TConfig = any> {\n name: string;\n methods: {\n session: BrowserSessionMethods<TSession, TConfig>;\n profile?: BrowserProfileMethods<TConfig>;\n extension?: BrowserExtensionMethods<TConfig>;\n pool?: BrowserPoolMethods<TSession, TConfig>;\n logs?: BrowserLogMethods<TConfig>;\n recording?: BrowserRecordingMethods<TConfig>;\n page?: BrowserPageMethods<TSession>;\n };\n}\n\n// ─── Generated Classes ───────────────────────────────────────────────────────\n\n/**\n * Generated browser session — implements ProviderBrowserSession\n */\nclass GeneratedBrowserSession<TSession = any> implements ProviderBrowserSession<TSession> {\n readonly sessionId: string;\n readonly connectUrl: string;\n readonly status: BrowserSession['status'];\n readonly createdAt?: Date;\n readonly metadata?: Record<string, unknown>;\n\n constructor(\n private session: TSession,\n sessionId: string,\n connectUrl: string,\n status: BrowserSession['status'] | undefined,\n private providerInstance: BrowserProvider<TSession>,\n private config: any,\n private sessionMethods: BrowserSessionMethods<TSession>,\n private logMethods?: BrowserLogMethods,\n private recordingMethods?: BrowserRecordingMethods,\n private pageMethods?: BrowserPageMethods<TSession>,\n ) {\n this.sessionId = sessionId;\n this.connectUrl = connectUrl;\n this.status = status ?? 'running';\n }\n\n getInstance(): TSession {\n return this.session;\n }\n\n getProvider(): BrowserProvider<TSession> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n await this.sessionMethods.destroy(this.config, this.sessionId);\n }\n\n async screenshot(options?: ScreenshotOptions): Promise<Uint8Array> {\n if (!this.pageMethods) {\n throw new Error(\n `Provider '${this.providerInstance.name}' does not support native page operations. ` +\n `Use the connectUrl to control the browser via Playwright/Puppeteer instead.`\n );\n }\n return this.pageMethods.screenshot(this.session, options);\n }\n\n async getLogs(): Promise<BrowserLog[]> {\n if (!this.logMethods) {\n throw new Error(`Provider '${this.providerInstance.name}' does not support log retrieval.`);\n }\n return this.logMethods.list(this.config, this.sessionId);\n }\n\n async getRecording(): Promise<BrowserRecording | null> {\n if (!this.recordingMethods) {\n throw new Error(`Provider '${this.providerInstance.name}' does not support recordings.`);\n }\n return this.recordingMethods.get(this.config, this.sessionId);\n }\n}\n\n/**\n * Generated session manager\n */\nclass GeneratedSessionManager<TSession, TConfig> implements BrowserSessionManager<TSession> {\n constructor(\n private config: TConfig,\n private methods: BrowserSessionMethods<TSession, TConfig>,\n private providerInstance: BrowserProvider<TSession>,\n private logMethods?: BrowserLogMethods<TConfig>,\n private recordingMethods?: BrowserRecordingMethods<TConfig>,\n private pageMethods?: BrowserPageMethods<TSession>,\n ) {}\n\n async create(options?: CreateBrowserSessionOptions): Promise<ProviderBrowserSession<TSession>> {\n const result = await this.methods.create(this.config, options);\n return new GeneratedBrowserSession(\n result.session, result.sessionId, result.connectUrl, result.status,\n this.providerInstance, this.config, this.methods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n );\n }\n\n async getById(sessionId: string): Promise<ProviderBrowserSession<TSession> | null> {\n const result = await this.methods.getById(this.config, sessionId);\n if (!result) return null;\n return new GeneratedBrowserSession(\n result.session, result.sessionId, result.connectUrl, result.status,\n this.providerInstance, this.config, this.methods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n );\n }\n\n async list(): Promise<ProviderBrowserSession<TSession>[]> {\n const results = await this.methods.list(this.config);\n return results.map(r => new GeneratedBrowserSession(\n r.session, r.sessionId, r.connectUrl, r.status,\n this.providerInstance, this.config, this.methods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n ));\n }\n\n async destroy(sessionId: string): Promise<void> {\n await this.methods.destroy(this.config, sessionId);\n }\n}\n\n/**\n * Generated profile manager\n */\nclass GeneratedProfileManager<TConfig> implements BrowserProfileManager {\n constructor(private config: TConfig, private methods: BrowserProfileMethods<TConfig>) {}\n\n async create(options?: CreateBrowserProfileOptions): Promise<BrowserProfile> {\n return this.methods.create(this.config, options);\n }\n async get(profileId: string): Promise<BrowserProfile | null> {\n return this.methods.get(this.config, profileId);\n }\n async list(): Promise<BrowserProfile[]> {\n return this.methods.list(this.config);\n }\n async delete(profileId: string): Promise<void> {\n return this.methods.delete(this.config, profileId);\n }\n}\n\n/**\n * Generated extension manager\n */\nclass GeneratedExtensionManager<TConfig> implements BrowserExtensionManager {\n constructor(private config: TConfig, private methods: BrowserExtensionMethods<TConfig>) {}\n\n async create(options: CreateBrowserExtensionOptions): Promise<BrowserExtension> {\n return this.methods.create(this.config, options);\n }\n async get(extensionId: string): Promise<BrowserExtension | null> {\n return this.methods.get(this.config, extensionId);\n }\n async delete(extensionId: string): Promise<void> {\n return this.methods.delete(this.config, extensionId);\n }\n}\n\n/**\n * Generated pool manager\n */\nclass GeneratedPoolManager<TSession, TConfig> implements BrowserPoolManager<TSession> {\n constructor(\n private config: TConfig,\n private methods: BrowserPoolMethods<TSession, TConfig>,\n private providerInstance: BrowserProvider<TSession>,\n private sessionMethods: BrowserSessionMethods<TSession, TConfig>,\n private logMethods?: BrowserLogMethods<TConfig>,\n private recordingMethods?: BrowserRecordingMethods<TConfig>,\n private pageMethods?: BrowserPageMethods<TSession>,\n ) {}\n\n async create(options: CreateBrowserPoolOptions): Promise<BrowserPool> {\n return this.methods.create(this.config, options);\n }\n async get(poolId: string): Promise<BrowserPool | null> {\n return this.methods.get(this.config, poolId);\n }\n async list(): Promise<BrowserPool[]> {\n return this.methods.list(this.config);\n }\n async acquire(poolId: string): Promise<ProviderBrowserSession<TSession>> {\n const result = await this.methods.acquire(this.config, poolId);\n return new GeneratedBrowserSession(\n result.session, result.sessionId, result.connectUrl, 'running',\n this.providerInstance, this.config, this.sessionMethods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n );\n }\n async release(poolId: string, sessionId: string): Promise<void> {\n return this.methods.release(this.config, poolId, sessionId);\n }\n async delete(poolId: string): Promise<void> {\n return this.methods.delete(this.config, poolId);\n }\n}\n\n/**\n * Generated page operations\n */\nclass GeneratedPageOperations<TSession> implements BrowserPageOperations<TSession> {\n pdf?: (session: TSession, options?: PdfOptions) => Promise<Uint8Array>;\n\n constructor(private methods: BrowserPageMethods<TSession>) {\n if (methods.pdf) {\n const pdfMethod = methods.pdf;\n this.pdf = (session: TSession, options?: PdfOptions) => pdfMethod(session, options);\n }\n }\n\n async navigate(session: TSession, url: string): Promise<void> {\n return this.methods.navigate(session, url);\n }\n async screenshot(session: TSession, options?: ScreenshotOptions): Promise<Uint8Array> {\n return this.methods.screenshot(session, options);\n }\n async evaluate(session: TSession, script: string): Promise<unknown> {\n return this.methods.evaluate(session, script);\n }\n async getContent(session: TSession): Promise<string> {\n return this.methods.getContent(session);\n }\n}\n\n/**\n * Generated browser provider\n */\nclass GeneratedBrowserProvider<TSession, TConfig> implements BrowserProvider<TSession> {\n readonly name: string;\n readonly session: BrowserSessionManager<TSession>;\n readonly profile?: BrowserProfileManager;\n readonly extension?: BrowserExtensionManager;\n readonly pool?: BrowserPoolManager;\n readonly logs?: BrowserLogManager;\n readonly recording?: BrowserRecordingManager;\n readonly page?: BrowserPageOperations<TSession>;\n\n private config: TConfig;\n private sessionMethods: BrowserSessionMethods<TSession, TConfig>;\n\n constructor(config: TConfig, providerConfig: BrowserProviderConfig<TSession, TConfig>) {\n this.name = providerConfig.name;\n this.config = config;\n this.sessionMethods = providerConfig.methods.session;\n\n const logMethods = providerConfig.methods.logs;\n const recordingMethods = providerConfig.methods.recording;\n const pageMethods = providerConfig.methods.page;\n\n // Session manager (always present)\n this.session = new GeneratedSessionManager(\n config, providerConfig.methods.session, this,\n logMethods, recordingMethods, pageMethods,\n );\n\n // Optional managers — auto-detected from provided methods\n if (providerConfig.methods.profile) {\n this.profile = new GeneratedProfileManager(config, providerConfig.methods.profile);\n }\n if (providerConfig.methods.extension) {\n this.extension = new GeneratedExtensionManager(config, providerConfig.methods.extension);\n }\n if (providerConfig.methods.pool) {\n this.pool = new GeneratedPoolManager(\n config, providerConfig.methods.pool, this,\n providerConfig.methods.session, logMethods, recordingMethods, pageMethods,\n );\n }\n if (logMethods) {\n this.logs = { list: (sessionId: string) => logMethods.list(config, sessionId) };\n }\n if (recordingMethods) {\n this.recording = { get: (sessionId: string) => recordingMethods.get(config, sessionId) };\n }\n if (pageMethods) {\n this.page = new GeneratedPageOperations(pageMethods);\n }\n }\n\n async getConnectUrl(sessionId: string): Promise<string> {\n return this.sessionMethods.getConnectUrl(this.config, sessionId);\n }\n}\n\n// ─── Public Factory ──────────────────────────────────────────────────────────\n\n/**\n * Create a browser provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n *\n * @example\n * ```ts\n * export const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({\n * name: 'browserbase',\n * methods: {\n * session: { create, getById, list, destroy, getConnectUrl },\n * profile: { create, get, list, delete },\n * logs: { list: getLogs },\n * recording: { get: getRecording },\n * },\n * });\n *\n * // Usage:\n * const provider = browserbase({ apiKey: 'bb_...' });\n * const session = await provider.session.create({ stealth: true });\n * console.log(session.connectUrl);\n * ```\n */\nexport function defineBrowserProvider<TSession, TConfig = any>(\n providerConfig: BrowserProviderConfig<TSession, TConfig>\n): (config: TConfig) => BrowserProvider<TSession> {\n return (config: TConfig) => {\n return new GeneratedBrowserProvider(config, providerConfig);\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}

@@ -51,3 +51,3 @@ // src/factory.ts

var GeneratedSandbox = class {
constructor(sandbox, sandboxId, providerName, methods, config, destroyMethod, providerInstance) {
constructor(sandbox, sandboxId, providerName, methods, config, destroyMethod, providerInstance, defaultRuntime) {
this.sandbox = sandbox;

@@ -60,2 +60,3 @@ this.methods = methods;

this.provider = providerName;
this.defaultRuntime = defaultRuntime;
if (methods.filesystem) {

@@ -74,3 +75,3 @@ this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);

async runCode(code, runtime) {
return await this.methods.runCode(this.sandbox, code, runtime, this.config);
return await this.methods.runCode(this.sandbox, code, runtime ?? this.defaultRuntime, this.config);
}

@@ -110,3 +111,4 @@ async runCommand(command, options) {

this.methods.destroy,
this.providerInstance
this.providerInstance,
options?.runtime
);

@@ -305,2 +307,253 @@ }

// src/browser-factory.ts
var GeneratedBrowserSession = class {
constructor(session, sessionId, connectUrl, status, providerInstance, config, sessionMethods, logMethods, recordingMethods, pageMethods) {
this.session = session;
this.providerInstance = providerInstance;
this.config = config;
this.sessionMethods = sessionMethods;
this.logMethods = logMethods;
this.recordingMethods = recordingMethods;
this.pageMethods = pageMethods;
this.sessionId = sessionId;
this.connectUrl = connectUrl;
this.status = status ?? "running";
}
getInstance() {
return this.session;
}
getProvider() {
return this.providerInstance;
}
async destroy() {
await this.sessionMethods.destroy(this.config, this.sessionId);
}
async screenshot(options) {
if (!this.pageMethods) {
throw new Error(
`Provider '${this.providerInstance.name}' does not support native page operations. Use the connectUrl to control the browser via Playwright/Puppeteer instead.`
);
}
return this.pageMethods.screenshot(this.session, options);
}
async getLogs() {
if (!this.logMethods) {
throw new Error(`Provider '${this.providerInstance.name}' does not support log retrieval.`);
}
return this.logMethods.list(this.config, this.sessionId);
}
async getRecording() {
if (!this.recordingMethods) {
throw new Error(`Provider '${this.providerInstance.name}' does not support recordings.`);
}
return this.recordingMethods.get(this.config, this.sessionId);
}
};
var GeneratedSessionManager = class {
constructor(config, methods, providerInstance, logMethods, recordingMethods, pageMethods) {
this.config = config;
this.methods = methods;
this.providerInstance = providerInstance;
this.logMethods = logMethods;
this.recordingMethods = recordingMethods;
this.pageMethods = pageMethods;
}
async create(options) {
const result = await this.methods.create(this.config, options);
return new GeneratedBrowserSession(
result.session,
result.sessionId,
result.connectUrl,
result.status,
this.providerInstance,
this.config,
this.methods,
this.logMethods,
this.recordingMethods,
this.pageMethods
);
}
async getById(sessionId) {
const result = await this.methods.getById(this.config, sessionId);
if (!result) return null;
return new GeneratedBrowserSession(
result.session,
result.sessionId,
result.connectUrl,
result.status,
this.providerInstance,
this.config,
this.methods,
this.logMethods,
this.recordingMethods,
this.pageMethods
);
}
async list() {
const results = await this.methods.list(this.config);
return results.map((r) => new GeneratedBrowserSession(
r.session,
r.sessionId,
r.connectUrl,
r.status,
this.providerInstance,
this.config,
this.methods,
this.logMethods,
this.recordingMethods,
this.pageMethods
));
}
async destroy(sessionId) {
await this.methods.destroy(this.config, sessionId);
}
};
var GeneratedProfileManager = class {
constructor(config, methods) {
this.config = config;
this.methods = methods;
}
async create(options) {
return this.methods.create(this.config, options);
}
async get(profileId) {
return this.methods.get(this.config, profileId);
}
async list() {
return this.methods.list(this.config);
}
async delete(profileId) {
return this.methods.delete(this.config, profileId);
}
};
var GeneratedExtensionManager = class {
constructor(config, methods) {
this.config = config;
this.methods = methods;
}
async create(options) {
return this.methods.create(this.config, options);
}
async get(extensionId) {
return this.methods.get(this.config, extensionId);
}
async delete(extensionId) {
return this.methods.delete(this.config, extensionId);
}
};
var GeneratedPoolManager = class {
constructor(config, methods, providerInstance, sessionMethods, logMethods, recordingMethods, pageMethods) {
this.config = config;
this.methods = methods;
this.providerInstance = providerInstance;
this.sessionMethods = sessionMethods;
this.logMethods = logMethods;
this.recordingMethods = recordingMethods;
this.pageMethods = pageMethods;
}
async create(options) {
return this.methods.create(this.config, options);
}
async get(poolId) {
return this.methods.get(this.config, poolId);
}
async list() {
return this.methods.list(this.config);
}
async acquire(poolId) {
const result = await this.methods.acquire(this.config, poolId);
return new GeneratedBrowserSession(
result.session,
result.sessionId,
result.connectUrl,
"running",
this.providerInstance,
this.config,
this.sessionMethods,
this.logMethods,
this.recordingMethods,
this.pageMethods
);
}
async release(poolId, sessionId) {
return this.methods.release(this.config, poolId, sessionId);
}
async delete(poolId) {
return this.methods.delete(this.config, poolId);
}
};
var GeneratedPageOperations = class {
constructor(methods) {
this.methods = methods;
if (methods.pdf) {
const pdfMethod = methods.pdf;
this.pdf = (session, options) => pdfMethod(session, options);
}
}
async navigate(session, url) {
return this.methods.navigate(session, url);
}
async screenshot(session, options) {
return this.methods.screenshot(session, options);
}
async evaluate(session, script) {
return this.methods.evaluate(session, script);
}
async getContent(session) {
return this.methods.getContent(session);
}
};
var GeneratedBrowserProvider = class {
constructor(config, providerConfig) {
this.name = providerConfig.name;
this.config = config;
this.sessionMethods = providerConfig.methods.session;
const logMethods = providerConfig.methods.logs;
const recordingMethods = providerConfig.methods.recording;
const pageMethods = providerConfig.methods.page;
this.session = new GeneratedSessionManager(
config,
providerConfig.methods.session,
this,
logMethods,
recordingMethods,
pageMethods
);
if (providerConfig.methods.profile) {
this.profile = new GeneratedProfileManager(config, providerConfig.methods.profile);
}
if (providerConfig.methods.extension) {
this.extension = new GeneratedExtensionManager(config, providerConfig.methods.extension);
}
if (providerConfig.methods.pool) {
this.pool = new GeneratedPoolManager(
config,
providerConfig.methods.pool,
this,
providerConfig.methods.session,
logMethods,
recordingMethods,
pageMethods
);
}
if (logMethods) {
this.logs = { list: (sessionId) => logMethods.list(config, sessionId) };
}
if (recordingMethods) {
this.recording = { get: (sessionId) => recordingMethods.get(config, sessionId) };
}
if (pageMethods) {
this.page = new GeneratedPageOperations(pageMethods);
}
}
async getConnectUrl(sessionId) {
return this.sessionMethods.getConnectUrl(this.config, sessionId);
}
};
function defineBrowserProvider(providerConfig) {
return (config) => {
return new GeneratedBrowserProvider(config, providerConfig);
};
}
// src/utils.ts

@@ -316,2 +569,3 @@ function calculateBackoff(attempt, baseDelay = 1e3, jitterMax = 100) {

createCompute,
defineBrowserProvider,
defineCompute,

@@ -318,0 +572,0 @@ defineInfraProvider,

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/factory.ts","../src/infra-factory.ts","../src/compute-factory.ts","../src/compute.ts","../src/utils.ts"],"sourcesContent":["/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Infrastructure Provider Factory\n * \n * Creates infrastructure-only providers that provision compute resources\n * but don't have native sandbox capabilities. Used by gateway server.\n */\n\nimport type { CreateSandboxOptions } from './types/index.js';\n\n/**\n * Infrastructure provider methods - only resource provisioning\n */\nexport interface InfraProviderMethods<TInstance = any, TConfig = any> {\n /** Create a new compute instance */\n create: (config: TConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n \n /** Get an existing instance by ID */\n getById: (config: TConfig, instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n \n /** List all instances */\n list: (config: TConfig) => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n \n /** Destroy an instance */\n destroy: (config: TConfig, instanceId: string) => Promise<void>;\n}\n\n/**\n * Daemon configuration passed to infrastructure providers\n */\nexport interface DaemonConfig {\n /** Access token for daemon authentication */\n accessToken: string;\n /** Gateway URL for daemon to connect to */\n gatewayUrl?: string;\n /** Additional daemon environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Infrastructure provider configuration\n */\nexport interface InfraProviderConfig<TInstance = any, TConfig = any> {\n name: string;\n methods: InfraProviderMethods<TInstance, TConfig>;\n}\n\n/**\n * Infrastructure provider interface returned by defineInfraProvider\n */\nexport interface InfraProvider<TInstance = any> {\n name: string;\n create: (options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n getById: (instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n list: () => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n destroy: (instanceId: string) => Promise<void>;\n}\n\n/**\n * Create an infrastructure provider from method definitions\n * \n * Infrastructure providers only handle resource provisioning.\n * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.\n * \n * @example\n * ```typescript\n * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n * name: 'railway',\n * methods: {\n * create: async (config, options) => {\n * // Create Railway service with daemon docker image\n * const service = await railwayAPI.createService({\n * ...config,\n * image: 'computesdk/daemon:latest',\n * env: options?.daemonConfig ? {\n * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,\n * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,\n * } : {}\n * });\n * return { instance: service, instanceId: service.id };\n * },\n * destroy: async (config, instanceId) => {\n * await railwayAPI.deleteService(config, instanceId);\n * },\n * getById: async (config, instanceId) => {\n * const service = await railwayAPI.getService(config, instanceId);\n * return service ? { instance: service, instanceId: service.id } : null;\n * },\n * list: async (config) => {\n * const services = await railwayAPI.listServices(config);\n * return services.map(s => ({ instance: s, instanceId: s.id }));\n * }\n * }\n * });\n * \n * // Gateway server usage:\n * const provider = railway({ apiKey, projectId, environmentId });\n * const { instance, instanceId } = await provider.create({\n * daemonConfig: { accessToken: 'token_xxx' }\n * });\n * ```\n */\nexport function defineInfraProvider<TInstance, TConfig = any>(\n config: InfraProviderConfig<TInstance, TConfig>\n): (providerConfig: TConfig) => InfraProvider<TInstance> {\n return (providerConfig: TConfig) => {\n return {\n name: config.name,\n \n create: async (options) => {\n return await config.methods.create(providerConfig, options);\n },\n \n getById: async (instanceId) => {\n return await config.methods.getById(providerConfig, instanceId);\n },\n \n list: async () => {\n return await config.methods.list(providerConfig);\n },\n \n destroy: async (instanceId) => {\n await config.methods.destroy(providerConfig, instanceId);\n }\n };\n };\n}\n","/**\n * Compute Factory\n *\n * Creates compute instance factories for infrastructure providers.\n * Allows providers like Railway to feel like first-class citizens while\n * routing through the gateway.\n */\n\nimport { compute, type CallableCompute, type ExplicitComputeConfig, type ProviderName } from 'computesdk';\n\n/**\n * Compute factory configuration\n */\nexport interface ComputeFactoryConfig {\n /** Provider name (must match gateway provider name) */\n provider: ProviderName;\n}\n\n/**\n * Base config for compute factories.\n * Omits 'provider' since that's set by the factory, not the user.\n */\nexport type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;\n\n/**\n * Create a compute instance factory for infrastructure providers\n *\n * This allows infrastructure providers like Railway to have their own\n * packages while routing through the gateway. Returns a function that\n * creates pre-configured compute instances.\n *\n * **Note:** This configures the global `compute` singleton. The returned\n * instance shares global state - calling this multiple times with different\n * configs will override previous configurations. This is intentional as\n * the compute singleton is designed to be configured once per application.\n *\n * @example\n * ```typescript\n * // Define Railway compute factory\n * export const railway = defineCompute<RailwayConfig>({\n * provider: 'railway'\n * });\n *\n * // User code:\n * import { railway } from '@computesdk/railway';\n *\n * const compute = railway({\n * apiKey: 'railway_xxx',\n * projectId: 'project_xxx',\n * environmentId: 'env_xxx'\n * });\n *\n * // Full compute API available\n * const sandbox = await compute.sandbox.create();\n * await sandbox.runCode('console.log(\"hello\")');\n * ```\n */\nexport function defineCompute<TConfig extends ComputeConfig>(\n factoryConfig: ComputeFactoryConfig\n): (config: TConfig) => CallableCompute {\n return (config: TConfig) => {\n compute.setConfig({\n ...config,\n provider: factoryConfig.provider,\n });\n return compute;\n };\n}\n","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}
{"version":3,"sources":["../src/factory.ts","../src/infra-factory.ts","../src/compute-factory.ts","../src/compute.ts","../src/browser-factory.ts","../src/utils.ts"],"sourcesContent":["/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n private defaultRuntime?: Runtime;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider,\n defaultRuntime?: Runtime\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n this.defaultRuntime = defaultRuntime;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime ?? this.defaultRuntime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance,\n options?.runtime\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Infrastructure Provider Factory\n * \n * Creates infrastructure-only providers that provision compute resources\n * but don't have native sandbox capabilities. Used by gateway server.\n */\n\nimport type { CreateSandboxOptions } from './types/index.js';\n\n/**\n * Infrastructure provider methods - only resource provisioning\n */\nexport interface InfraProviderMethods<TInstance = any, TConfig = any> {\n /** Create a new compute instance */\n create: (config: TConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n \n /** Get an existing instance by ID */\n getById: (config: TConfig, instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n \n /** List all instances */\n list: (config: TConfig) => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n \n /** Destroy an instance */\n destroy: (config: TConfig, instanceId: string) => Promise<void>;\n}\n\n/**\n * Daemon configuration passed to infrastructure providers\n */\nexport interface DaemonConfig {\n /** Access token for daemon authentication */\n accessToken: string;\n /** Gateway URL for daemon to connect to */\n gatewayUrl?: string;\n /** Additional daemon environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Infrastructure provider configuration\n */\nexport interface InfraProviderConfig<TInstance = any, TConfig = any> {\n name: string;\n methods: InfraProviderMethods<TInstance, TConfig>;\n}\n\n/**\n * Infrastructure provider interface returned by defineInfraProvider\n */\nexport interface InfraProvider<TInstance = any> {\n name: string;\n create: (options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n getById: (instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n list: () => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n destroy: (instanceId: string) => Promise<void>;\n}\n\n/**\n * Create an infrastructure provider from method definitions\n * \n * Infrastructure providers only handle resource provisioning.\n * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.\n * \n * @example\n * ```typescript\n * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n * name: 'railway',\n * methods: {\n * create: async (config, options) => {\n * // Create Railway service with daemon docker image\n * const service = await railwayAPI.createService({\n * ...config,\n * image: 'computesdk/daemon:latest',\n * env: options?.daemonConfig ? {\n * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,\n * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,\n * } : {}\n * });\n * return { instance: service, instanceId: service.id };\n * },\n * destroy: async (config, instanceId) => {\n * await railwayAPI.deleteService(config, instanceId);\n * },\n * getById: async (config, instanceId) => {\n * const service = await railwayAPI.getService(config, instanceId);\n * return service ? { instance: service, instanceId: service.id } : null;\n * },\n * list: async (config) => {\n * const services = await railwayAPI.listServices(config);\n * return services.map(s => ({ instance: s, instanceId: s.id }));\n * }\n * }\n * });\n * \n * // Gateway server usage:\n * const provider = railway({ apiKey, projectId, environmentId });\n * const { instance, instanceId } = await provider.create({\n * daemonConfig: { accessToken: 'token_xxx' }\n * });\n * ```\n */\nexport function defineInfraProvider<TInstance, TConfig = any>(\n config: InfraProviderConfig<TInstance, TConfig>\n): (providerConfig: TConfig) => InfraProvider<TInstance> {\n return (providerConfig: TConfig) => {\n return {\n name: config.name,\n \n create: async (options) => {\n return await config.methods.create(providerConfig, options);\n },\n \n getById: async (instanceId) => {\n return await config.methods.getById(providerConfig, instanceId);\n },\n \n list: async () => {\n return await config.methods.list(providerConfig);\n },\n \n destroy: async (instanceId) => {\n await config.methods.destroy(providerConfig, instanceId);\n }\n };\n };\n}\n","/**\n * Compute Factory\n *\n * Creates compute instance factories for infrastructure providers.\n * Allows providers like Railway to feel like first-class citizens while\n * routing through the gateway.\n */\n\nimport { compute, type CallableCompute, type ExplicitComputeConfig, type ProviderName } from 'computesdk';\n\n/**\n * Compute factory configuration\n */\nexport interface ComputeFactoryConfig {\n /** Provider name (must match gateway provider name) */\n provider: ProviderName;\n}\n\n/**\n * Base config for compute factories.\n * Omits 'provider' since that's set by the factory, not the user.\n */\nexport type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;\n\n/**\n * Create a compute instance factory for infrastructure providers\n *\n * This allows infrastructure providers like Railway to have their own\n * packages while routing through the gateway. Returns a function that\n * creates pre-configured compute instances.\n *\n * **Note:** This configures the global `compute` singleton. The returned\n * instance shares global state - calling this multiple times with different\n * configs will override previous configurations. This is intentional as\n * the compute singleton is designed to be configured once per application.\n *\n * @example\n * ```typescript\n * // Define Railway compute factory\n * export const railway = defineCompute<RailwayConfig>({\n * provider: 'railway'\n * });\n *\n * // User code:\n * import { railway } from '@computesdk/railway';\n *\n * const compute = railway({\n * apiKey: 'railway_xxx',\n * projectId: 'project_xxx',\n * environmentId: 'env_xxx'\n * });\n *\n * // Full compute API available\n * const sandbox = await compute.sandbox.create();\n * await sandbox.runCode('console.log(\"hello\")');\n * ```\n */\nexport function defineCompute<TConfig extends ComputeConfig>(\n factoryConfig: ComputeFactoryConfig\n): (config: TConfig) => CallableCompute {\n return (config: TConfig) => {\n compute.setConfig({\n ...config,\n provider: factoryConfig.provider,\n });\n return compute;\n };\n}\n","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Browser Provider Factory - Creates browser providers from method definitions\n *\n * Eliminates boilerplate by auto-generating BrowserProvider/Session classes\n * from simple method definitions with automatic feature detection.\n * Mirrors the sandbox provider factory pattern.\n */\n\nimport type {\n BrowserProvider,\n BrowserSessionManager,\n BrowserProfileManager,\n BrowserExtensionManager,\n BrowserPoolManager,\n BrowserLogManager,\n BrowserRecordingManager,\n BrowserPageOperations,\n ProviderBrowserSession,\n BrowserSession,\n BrowserProfile,\n BrowserExtension,\n BrowserPool,\n BrowserLog,\n BrowserRecording,\n CreateBrowserSessionOptions,\n CreateBrowserProfileOptions,\n CreateBrowserExtensionOptions,\n CreateBrowserPoolOptions,\n ScreenshotOptions,\n PdfOptions,\n} from './types/browser.js';\n\n// ─── Method Definitions ──────────────────────────────────────────────────────\n\n/**\n * Session method implementations that provider authors supply\n */\nexport interface BrowserSessionMethods<TSession = any, TConfig = any> {\n create: (config: TConfig, options?: CreateBrowserSessionOptions) => Promise<{ session: TSession; sessionId: string; connectUrl: string; status?: BrowserSession['status'] }>;\n getById: (config: TConfig, sessionId: string) => Promise<{ session: TSession; sessionId: string; connectUrl: string; status?: BrowserSession['status'] } | null>;\n list: (config: TConfig) => Promise<Array<{ session: TSession; sessionId: string; connectUrl: string; status?: BrowserSession['status'] }>>;\n destroy: (config: TConfig, sessionId: string) => Promise<void>;\n getConnectUrl: (config: TConfig, sessionId: string) => Promise<string>;\n}\n\n/**\n * Profile method implementations\n */\nexport interface BrowserProfileMethods<TConfig = any> {\n create: (config: TConfig, options?: CreateBrowserProfileOptions) => Promise<BrowserProfile>;\n get: (config: TConfig, profileId: string) => Promise<BrowserProfile | null>;\n list: (config: TConfig) => Promise<BrowserProfile[]>;\n delete: (config: TConfig, profileId: string) => Promise<void>;\n}\n\n/**\n * Extension method implementations\n */\nexport interface BrowserExtensionMethods<TConfig = any> {\n create: (config: TConfig, options: CreateBrowserExtensionOptions) => Promise<BrowserExtension>;\n get: (config: TConfig, extensionId: string) => Promise<BrowserExtension | null>;\n delete: (config: TConfig, extensionId: string) => Promise<void>;\n}\n\n/**\n * Pool method implementations\n */\nexport interface BrowserPoolMethods<TSession = any, TConfig = any> {\n create: (config: TConfig, options: CreateBrowserPoolOptions) => Promise<BrowserPool>;\n get: (config: TConfig, poolId: string) => Promise<BrowserPool | null>;\n list: (config: TConfig) => Promise<BrowserPool[]>;\n acquire: (config: TConfig, poolId: string) => Promise<{ session: TSession; sessionId: string; connectUrl: string }>;\n release: (config: TConfig, poolId: string, sessionId: string) => Promise<void>;\n delete: (config: TConfig, poolId: string) => Promise<void>;\n}\n\n/**\n * Log method implementations\n */\nexport interface BrowserLogMethods<TConfig = any> {\n list: (config: TConfig, sessionId: string) => Promise<BrowserLog[]>;\n}\n\n/**\n * Recording method implementations\n */\nexport interface BrowserRecordingMethods<TConfig = any> {\n get: (config: TConfig, sessionId: string) => Promise<BrowserRecording | null>;\n}\n\n/**\n * Page operation method implementations\n */\nexport interface BrowserPageMethods<TSession = any> {\n navigate: (session: TSession, url: string) => Promise<void>;\n screenshot: (session: TSession, options?: ScreenshotOptions) => Promise<Uint8Array>;\n pdf?: (session: TSession, options?: PdfOptions) => Promise<Uint8Array>;\n evaluate: (session: TSession, script: string) => Promise<unknown>;\n getContent: (session: TSession) => Promise<string>;\n}\n\n/**\n * Full browser provider configuration for defineBrowserProvider()\n */\nexport interface BrowserProviderConfig<TSession = any, TConfig = any> {\n name: string;\n methods: {\n session: BrowserSessionMethods<TSession, TConfig>;\n profile?: BrowserProfileMethods<TConfig>;\n extension?: BrowserExtensionMethods<TConfig>;\n pool?: BrowserPoolMethods<TSession, TConfig>;\n logs?: BrowserLogMethods<TConfig>;\n recording?: BrowserRecordingMethods<TConfig>;\n page?: BrowserPageMethods<TSession>;\n };\n}\n\n// ─── Generated Classes ───────────────────────────────────────────────────────\n\n/**\n * Generated browser session — implements ProviderBrowserSession\n */\nclass GeneratedBrowserSession<TSession = any> implements ProviderBrowserSession<TSession> {\n readonly sessionId: string;\n readonly connectUrl: string;\n readonly status: BrowserSession['status'];\n readonly createdAt?: Date;\n readonly metadata?: Record<string, unknown>;\n\n constructor(\n private session: TSession,\n sessionId: string,\n connectUrl: string,\n status: BrowserSession['status'] | undefined,\n private providerInstance: BrowserProvider<TSession>,\n private config: any,\n private sessionMethods: BrowserSessionMethods<TSession>,\n private logMethods?: BrowserLogMethods,\n private recordingMethods?: BrowserRecordingMethods,\n private pageMethods?: BrowserPageMethods<TSession>,\n ) {\n this.sessionId = sessionId;\n this.connectUrl = connectUrl;\n this.status = status ?? 'running';\n }\n\n getInstance(): TSession {\n return this.session;\n }\n\n getProvider(): BrowserProvider<TSession> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n await this.sessionMethods.destroy(this.config, this.sessionId);\n }\n\n async screenshot(options?: ScreenshotOptions): Promise<Uint8Array> {\n if (!this.pageMethods) {\n throw new Error(\n `Provider '${this.providerInstance.name}' does not support native page operations. ` +\n `Use the connectUrl to control the browser via Playwright/Puppeteer instead.`\n );\n }\n return this.pageMethods.screenshot(this.session, options);\n }\n\n async getLogs(): Promise<BrowserLog[]> {\n if (!this.logMethods) {\n throw new Error(`Provider '${this.providerInstance.name}' does not support log retrieval.`);\n }\n return this.logMethods.list(this.config, this.sessionId);\n }\n\n async getRecording(): Promise<BrowserRecording | null> {\n if (!this.recordingMethods) {\n throw new Error(`Provider '${this.providerInstance.name}' does not support recordings.`);\n }\n return this.recordingMethods.get(this.config, this.sessionId);\n }\n}\n\n/**\n * Generated session manager\n */\nclass GeneratedSessionManager<TSession, TConfig> implements BrowserSessionManager<TSession> {\n constructor(\n private config: TConfig,\n private methods: BrowserSessionMethods<TSession, TConfig>,\n private providerInstance: BrowserProvider<TSession>,\n private logMethods?: BrowserLogMethods<TConfig>,\n private recordingMethods?: BrowserRecordingMethods<TConfig>,\n private pageMethods?: BrowserPageMethods<TSession>,\n ) {}\n\n async create(options?: CreateBrowserSessionOptions): Promise<ProviderBrowserSession<TSession>> {\n const result = await this.methods.create(this.config, options);\n return new GeneratedBrowserSession(\n result.session, result.sessionId, result.connectUrl, result.status,\n this.providerInstance, this.config, this.methods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n );\n }\n\n async getById(sessionId: string): Promise<ProviderBrowserSession<TSession> | null> {\n const result = await this.methods.getById(this.config, sessionId);\n if (!result) return null;\n return new GeneratedBrowserSession(\n result.session, result.sessionId, result.connectUrl, result.status,\n this.providerInstance, this.config, this.methods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n );\n }\n\n async list(): Promise<ProviderBrowserSession<TSession>[]> {\n const results = await this.methods.list(this.config);\n return results.map(r => new GeneratedBrowserSession(\n r.session, r.sessionId, r.connectUrl, r.status,\n this.providerInstance, this.config, this.methods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n ));\n }\n\n async destroy(sessionId: string): Promise<void> {\n await this.methods.destroy(this.config, sessionId);\n }\n}\n\n/**\n * Generated profile manager\n */\nclass GeneratedProfileManager<TConfig> implements BrowserProfileManager {\n constructor(private config: TConfig, private methods: BrowserProfileMethods<TConfig>) {}\n\n async create(options?: CreateBrowserProfileOptions): Promise<BrowserProfile> {\n return this.methods.create(this.config, options);\n }\n async get(profileId: string): Promise<BrowserProfile | null> {\n return this.methods.get(this.config, profileId);\n }\n async list(): Promise<BrowserProfile[]> {\n return this.methods.list(this.config);\n }\n async delete(profileId: string): Promise<void> {\n return this.methods.delete(this.config, profileId);\n }\n}\n\n/**\n * Generated extension manager\n */\nclass GeneratedExtensionManager<TConfig> implements BrowserExtensionManager {\n constructor(private config: TConfig, private methods: BrowserExtensionMethods<TConfig>) {}\n\n async create(options: CreateBrowserExtensionOptions): Promise<BrowserExtension> {\n return this.methods.create(this.config, options);\n }\n async get(extensionId: string): Promise<BrowserExtension | null> {\n return this.methods.get(this.config, extensionId);\n }\n async delete(extensionId: string): Promise<void> {\n return this.methods.delete(this.config, extensionId);\n }\n}\n\n/**\n * Generated pool manager\n */\nclass GeneratedPoolManager<TSession, TConfig> implements BrowserPoolManager<TSession> {\n constructor(\n private config: TConfig,\n private methods: BrowserPoolMethods<TSession, TConfig>,\n private providerInstance: BrowserProvider<TSession>,\n private sessionMethods: BrowserSessionMethods<TSession, TConfig>,\n private logMethods?: BrowserLogMethods<TConfig>,\n private recordingMethods?: BrowserRecordingMethods<TConfig>,\n private pageMethods?: BrowserPageMethods<TSession>,\n ) {}\n\n async create(options: CreateBrowserPoolOptions): Promise<BrowserPool> {\n return this.methods.create(this.config, options);\n }\n async get(poolId: string): Promise<BrowserPool | null> {\n return this.methods.get(this.config, poolId);\n }\n async list(): Promise<BrowserPool[]> {\n return this.methods.list(this.config);\n }\n async acquire(poolId: string): Promise<ProviderBrowserSession<TSession>> {\n const result = await this.methods.acquire(this.config, poolId);\n return new GeneratedBrowserSession(\n result.session, result.sessionId, result.connectUrl, 'running',\n this.providerInstance, this.config, this.sessionMethods,\n this.logMethods, this.recordingMethods, this.pageMethods,\n );\n }\n async release(poolId: string, sessionId: string): Promise<void> {\n return this.methods.release(this.config, poolId, sessionId);\n }\n async delete(poolId: string): Promise<void> {\n return this.methods.delete(this.config, poolId);\n }\n}\n\n/**\n * Generated page operations\n */\nclass GeneratedPageOperations<TSession> implements BrowserPageOperations<TSession> {\n pdf?: (session: TSession, options?: PdfOptions) => Promise<Uint8Array>;\n\n constructor(private methods: BrowserPageMethods<TSession>) {\n if (methods.pdf) {\n const pdfMethod = methods.pdf;\n this.pdf = (session: TSession, options?: PdfOptions) => pdfMethod(session, options);\n }\n }\n\n async navigate(session: TSession, url: string): Promise<void> {\n return this.methods.navigate(session, url);\n }\n async screenshot(session: TSession, options?: ScreenshotOptions): Promise<Uint8Array> {\n return this.methods.screenshot(session, options);\n }\n async evaluate(session: TSession, script: string): Promise<unknown> {\n return this.methods.evaluate(session, script);\n }\n async getContent(session: TSession): Promise<string> {\n return this.methods.getContent(session);\n }\n}\n\n/**\n * Generated browser provider\n */\nclass GeneratedBrowserProvider<TSession, TConfig> implements BrowserProvider<TSession> {\n readonly name: string;\n readonly session: BrowserSessionManager<TSession>;\n readonly profile?: BrowserProfileManager;\n readonly extension?: BrowserExtensionManager;\n readonly pool?: BrowserPoolManager;\n readonly logs?: BrowserLogManager;\n readonly recording?: BrowserRecordingManager;\n readonly page?: BrowserPageOperations<TSession>;\n\n private config: TConfig;\n private sessionMethods: BrowserSessionMethods<TSession, TConfig>;\n\n constructor(config: TConfig, providerConfig: BrowserProviderConfig<TSession, TConfig>) {\n this.name = providerConfig.name;\n this.config = config;\n this.sessionMethods = providerConfig.methods.session;\n\n const logMethods = providerConfig.methods.logs;\n const recordingMethods = providerConfig.methods.recording;\n const pageMethods = providerConfig.methods.page;\n\n // Session manager (always present)\n this.session = new GeneratedSessionManager(\n config, providerConfig.methods.session, this,\n logMethods, recordingMethods, pageMethods,\n );\n\n // Optional managers — auto-detected from provided methods\n if (providerConfig.methods.profile) {\n this.profile = new GeneratedProfileManager(config, providerConfig.methods.profile);\n }\n if (providerConfig.methods.extension) {\n this.extension = new GeneratedExtensionManager(config, providerConfig.methods.extension);\n }\n if (providerConfig.methods.pool) {\n this.pool = new GeneratedPoolManager(\n config, providerConfig.methods.pool, this,\n providerConfig.methods.session, logMethods, recordingMethods, pageMethods,\n );\n }\n if (logMethods) {\n this.logs = { list: (sessionId: string) => logMethods.list(config, sessionId) };\n }\n if (recordingMethods) {\n this.recording = { get: (sessionId: string) => recordingMethods.get(config, sessionId) };\n }\n if (pageMethods) {\n this.page = new GeneratedPageOperations(pageMethods);\n }\n }\n\n async getConnectUrl(sessionId: string): Promise<string> {\n return this.sessionMethods.getConnectUrl(this.config, sessionId);\n }\n}\n\n// ─── Public Factory ──────────────────────────────────────────────────────────\n\n/**\n * Create a browser provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n *\n * @example\n * ```ts\n * export const browserbase = defineBrowserProvider<BrowserbaseSession, BrowserbaseConfig>({\n * name: 'browserbase',\n * methods: {\n * session: { create, getById, list, destroy, getConnectUrl },\n * profile: { create, get, list, delete },\n * logs: { list: getLogs },\n * recording: { get: getRecording },\n * },\n * });\n *\n * // Usage:\n * const provider = browserbase({ apiKey: 'bb_...' });\n * const session = await provider.session.create({ stealth: true });\n * console.log(session.connectUrl);\n * ```\n */\nexport function defineBrowserProvider<TSession, TConfig = any>(\n providerConfig: BrowserProviderConfig<TSession, TConfig>\n): (config: TConfig) => BrowserProvider<TSession> {\n return (config: TConfig) => {\n return new GeneratedBrowserProvider(config, providerConfig);\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}
{
"name": "@computesdk/provider",
"version": "1.0.33",
"version": "1.1.0",
"description": "Provider framework for ComputeSDK - define custom sandbox providers",

@@ -39,3 +39,3 @@ "author": "Garrison",

"@computesdk/cmd": "0.4.1",
"computesdk": "2.5.3"
"computesdk": "2.5.4"
},

@@ -42,0 +42,0 @@ "devDependencies": {