computesdk 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +87 -13
- package/dist/index.d.ts +87 -13
- package/dist/index.js +79 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +77 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -7,6 +7,17 @@ interface Provider$1 {
|
|
|
7
7
|
readonly name: string;
|
|
8
8
|
readonly sandbox: any;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Utility type to extract the native instance type from a provider
|
|
12
|
+
* This enables proper typing for getInstance() calls by looking at the provider's internal types
|
|
13
|
+
*/
|
|
14
|
+
type ExtractSandboxInstanceType<TProvider extends Provider$1> = TProvider extends Provider$1 ? TProvider extends {
|
|
15
|
+
sandbox: {
|
|
16
|
+
create(): Promise<infer TSandbox>;
|
|
17
|
+
};
|
|
18
|
+
} ? (TSandbox extends {
|
|
19
|
+
getInstance(): infer TInstance;
|
|
20
|
+
} ? TInstance : any) : any : any;
|
|
10
21
|
/**
|
|
11
22
|
* Supported runtime environments
|
|
12
23
|
*/
|
|
@@ -15,6 +26,13 @@ type Runtime = 'node' | 'python';
|
|
|
15
26
|
* Sandbox status types
|
|
16
27
|
*/
|
|
17
28
|
type SandboxStatus = 'running' | 'stopped' | 'error';
|
|
29
|
+
/**
|
|
30
|
+
* Options for running commands
|
|
31
|
+
*/
|
|
32
|
+
interface RunCommandOptions {
|
|
33
|
+
/** Run command in background (non-blocking) */
|
|
34
|
+
background?: boolean;
|
|
35
|
+
}
|
|
18
36
|
/**
|
|
19
37
|
* Result of code execution
|
|
20
38
|
*/
|
|
@@ -31,6 +49,10 @@ interface ExecutionResult {
|
|
|
31
49
|
sandboxId: string;
|
|
32
50
|
/** Provider that executed the code */
|
|
33
51
|
provider: string;
|
|
52
|
+
/** Process ID for background jobs (if applicable) */
|
|
53
|
+
pid?: number;
|
|
54
|
+
/** Whether this command is running in background */
|
|
55
|
+
isBackground?: boolean;
|
|
34
56
|
}
|
|
35
57
|
/**
|
|
36
58
|
* Information about a sandbox
|
|
@@ -135,7 +157,7 @@ interface Sandbox {
|
|
|
135
157
|
/** Execute code in the sandbox */
|
|
136
158
|
runCode(code: string, runtime?: Runtime): Promise<ExecutionResult>;
|
|
137
159
|
/** Execute shell commands */
|
|
138
|
-
runCommand(command: string, args?: string[]): Promise<ExecutionResult>;
|
|
160
|
+
runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult>;
|
|
139
161
|
/** Get information about the sandbox */
|
|
140
162
|
getInfo(): Promise<SandboxInfo>;
|
|
141
163
|
/** Get URL for accessing the sandbox on a specific port */
|
|
@@ -154,12 +176,16 @@ interface Sandbox {
|
|
|
154
176
|
/** File system operations */
|
|
155
177
|
readonly filesystem: SandboxFileSystem;
|
|
156
178
|
}
|
|
157
|
-
|
|
158
179
|
/**
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
* Types related to provider configuration, authentication, and resource management
|
|
180
|
+
* Typed sandbox interface that preserves the provider's native instance type
|
|
162
181
|
*/
|
|
182
|
+
interface TypedSandbox<TProvider extends Provider$1> extends Sandbox {
|
|
183
|
+
/** Get the provider instance that created this sandbox with proper typing */
|
|
184
|
+
getProvider(): TProvider;
|
|
185
|
+
/** Get the native provider sandbox instance with proper typing */
|
|
186
|
+
getInstance(): ExtractSandboxInstanceType<TProvider>;
|
|
187
|
+
getInstance<T>(): T;
|
|
188
|
+
}
|
|
163
189
|
|
|
164
190
|
/**
|
|
165
191
|
* Provider sandbox management interface
|
|
@@ -186,11 +212,11 @@ interface Provider {
|
|
|
186
212
|
/**
|
|
187
213
|
* Configuration for the compute singleton
|
|
188
214
|
*/
|
|
189
|
-
interface ComputeConfig {
|
|
215
|
+
interface ComputeConfig<TProvider extends Provider = Provider> {
|
|
190
216
|
/** Default provider to use when none is specified */
|
|
191
|
-
defaultProvider?:
|
|
217
|
+
defaultProvider?: TProvider;
|
|
192
218
|
/** @deprecated Use defaultProvider instead. Kept for backwards compatibility */
|
|
193
|
-
provider?:
|
|
219
|
+
provider?: TProvider;
|
|
194
220
|
}
|
|
195
221
|
/**
|
|
196
222
|
* Parameters for compute.sandbox.create()
|
|
@@ -211,11 +237,11 @@ interface CreateSandboxParamsWithOptionalProvider {
|
|
|
211
237
|
options?: CreateSandboxOptions;
|
|
212
238
|
}
|
|
213
239
|
/**
|
|
214
|
-
* Compute
|
|
240
|
+
* Base Compute API interface (non-generic)
|
|
215
241
|
*/
|
|
216
242
|
interface ComputeAPI {
|
|
217
243
|
/** Configuration management */
|
|
218
|
-
setConfig(config: ComputeConfig): void;
|
|
244
|
+
setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void;
|
|
219
245
|
getConfig(): ComputeConfig | null;
|
|
220
246
|
clearConfig(): void;
|
|
221
247
|
sandbox: {
|
|
@@ -229,6 +255,23 @@ interface ComputeAPI {
|
|
|
229
255
|
destroy(providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void>;
|
|
230
256
|
};
|
|
231
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Typed Compute API interface that preserves provider type information
|
|
260
|
+
*/
|
|
261
|
+
interface TypedComputeAPI<TProvider extends Provider> extends Omit<ComputeAPI, 'sandbox' | 'setConfig'> {
|
|
262
|
+
/** Configuration management that returns typed compute instance */
|
|
263
|
+
setConfig<T extends Provider>(config: ComputeConfig<T>): TypedComputeAPI<T>;
|
|
264
|
+
sandbox: {
|
|
265
|
+
/** Create a sandbox from the configured provider with proper typing */
|
|
266
|
+
create(params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>): Promise<TypedSandbox<TProvider>>;
|
|
267
|
+
/** Get an existing sandbox by ID from the configured provider with proper typing */
|
|
268
|
+
getById(sandboxId: string): Promise<TypedSandbox<TProvider> | null>;
|
|
269
|
+
/** List all active sandboxes from the configured provider with proper typing */
|
|
270
|
+
list(): Promise<TypedSandbox<TProvider>[]>;
|
|
271
|
+
/** Destroy a sandbox via the configured provider */
|
|
272
|
+
destroy(sandboxId: string): Promise<void>;
|
|
273
|
+
};
|
|
274
|
+
}
|
|
232
275
|
|
|
233
276
|
/**
|
|
234
277
|
* Compute Singleton - Main API Orchestrator
|
|
@@ -237,9 +280,27 @@ interface ComputeAPI {
|
|
|
237
280
|
*/
|
|
238
281
|
|
|
239
282
|
/**
|
|
240
|
-
* Singleton instance - the main API
|
|
283
|
+
* Singleton instance - the main API (untyped)
|
|
241
284
|
*/
|
|
242
285
|
declare const compute: ComputeAPI;
|
|
286
|
+
/**
|
|
287
|
+
* Create a compute instance with proper typing
|
|
288
|
+
* This enables proper type inference for getInstance() calls
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```typescript
|
|
292
|
+
* import { e2b } from '@computesdk/e2b'
|
|
293
|
+
* import { createCompute } from 'computesdk'
|
|
294
|
+
*
|
|
295
|
+
* const compute = createCompute({
|
|
296
|
+
* defaultProvider: e2b({ apiKey: 'your-key' }),
|
|
297
|
+
* });
|
|
298
|
+
*
|
|
299
|
+
* const sandbox = await compute.sandbox.create();
|
|
300
|
+
* const instance = sandbox.getInstance(); // ✅ Properly typed!
|
|
301
|
+
* ```
|
|
302
|
+
*/
|
|
303
|
+
declare function createCompute<TProvider extends Provider>(config: ComputeConfig<TProvider>): TypedComputeAPI<TProvider>;
|
|
243
304
|
|
|
244
305
|
/**
|
|
245
306
|
* Simplified Request Handler for Web Framework Integration
|
|
@@ -262,6 +323,10 @@ interface ComputeRequest {
|
|
|
262
323
|
runtime?: Runtime;
|
|
263
324
|
path?: string;
|
|
264
325
|
content?: string;
|
|
326
|
+
/** Command options (for runCommand action) */
|
|
327
|
+
commandOptions?: {
|
|
328
|
+
background?: boolean;
|
|
329
|
+
};
|
|
265
330
|
/** Sandbox creation options */
|
|
266
331
|
options?: {
|
|
267
332
|
runtime?: Runtime;
|
|
@@ -299,6 +364,15 @@ interface HandleComputeRequestParams {
|
|
|
299
364
|
* from simple method definitions with automatic feature detection.
|
|
300
365
|
*/
|
|
301
366
|
|
|
367
|
+
/**
|
|
368
|
+
* Helper function to handle background command execution
|
|
369
|
+
* Providers can use this to implement background job support
|
|
370
|
+
*/
|
|
371
|
+
declare function createBackgroundCommand(command: string, args?: string[], options?: RunCommandOptions): {
|
|
372
|
+
command: string;
|
|
373
|
+
args: string[];
|
|
374
|
+
isBackground: boolean;
|
|
375
|
+
};
|
|
302
376
|
/**
|
|
303
377
|
* Flat sandbox method implementations - all operations in one place
|
|
304
378
|
*/
|
|
@@ -317,7 +391,7 @@ interface SandboxMethods<TSandbox = any, TConfig = any> {
|
|
|
317
391
|
}>>;
|
|
318
392
|
destroy: (config: TConfig, sandboxId: string) => Promise<void>;
|
|
319
393
|
runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;
|
|
320
|
-
runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>;
|
|
394
|
+
runCommand: (sandbox: TSandbox, command: string, args?: string[], options?: RunCommandOptions) => Promise<ExecutionResult>;
|
|
321
395
|
getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;
|
|
322
396
|
getUrl: (sandbox: TSandbox, options: {
|
|
323
397
|
port: number;
|
|
@@ -350,4 +424,4 @@ interface ProviderConfig<TSandbox = any, TConfig = any> {
|
|
|
350
424
|
*/
|
|
351
425
|
declare function createProvider<TSandbox, TConfig>(providerConfig: ProviderConfig<TSandbox, TConfig>): (config: TConfig) => Provider;
|
|
352
426
|
|
|
353
|
-
export { CommandExitError, type ComputeAPI, type ComputeConfig, type ComputeRequest, type ComputeResponse, type CreateSandboxOptions, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type ExecutionResult, type FileEntry, type HandleComputeRequestParams, type Provider, type ProviderConfig, type ProviderSandboxManager, type Runtime, type Sandbox, type SandboxFileSystem, type SandboxInfo, type SandboxMethods, type SandboxStatus, compute, createProvider, handleComputeRequest, isCommandExitError };
|
|
427
|
+
export { CommandExitError, type ComputeAPI, type ComputeConfig, type ComputeRequest, type ComputeResponse, type CreateSandboxOptions, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type ExecutionResult, type ExtractSandboxInstanceType, type FileEntry, type HandleComputeRequestParams, type Provider, type ProviderConfig, type ProviderSandboxManager, type RunCommandOptions, type Runtime, type Sandbox, type SandboxFileSystem, type SandboxInfo, type SandboxMethods, type SandboxStatus, type TypedComputeAPI, type TypedSandbox, compute, createBackgroundCommand, createCompute, createProvider, handleComputeRequest, isCommandExitError };
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,17 @@ interface Provider$1 {
|
|
|
7
7
|
readonly name: string;
|
|
8
8
|
readonly sandbox: any;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Utility type to extract the native instance type from a provider
|
|
12
|
+
* This enables proper typing for getInstance() calls by looking at the provider's internal types
|
|
13
|
+
*/
|
|
14
|
+
type ExtractSandboxInstanceType<TProvider extends Provider$1> = TProvider extends Provider$1 ? TProvider extends {
|
|
15
|
+
sandbox: {
|
|
16
|
+
create(): Promise<infer TSandbox>;
|
|
17
|
+
};
|
|
18
|
+
} ? (TSandbox extends {
|
|
19
|
+
getInstance(): infer TInstance;
|
|
20
|
+
} ? TInstance : any) : any : any;
|
|
10
21
|
/**
|
|
11
22
|
* Supported runtime environments
|
|
12
23
|
*/
|
|
@@ -15,6 +26,13 @@ type Runtime = 'node' | 'python';
|
|
|
15
26
|
* Sandbox status types
|
|
16
27
|
*/
|
|
17
28
|
type SandboxStatus = 'running' | 'stopped' | 'error';
|
|
29
|
+
/**
|
|
30
|
+
* Options for running commands
|
|
31
|
+
*/
|
|
32
|
+
interface RunCommandOptions {
|
|
33
|
+
/** Run command in background (non-blocking) */
|
|
34
|
+
background?: boolean;
|
|
35
|
+
}
|
|
18
36
|
/**
|
|
19
37
|
* Result of code execution
|
|
20
38
|
*/
|
|
@@ -31,6 +49,10 @@ interface ExecutionResult {
|
|
|
31
49
|
sandboxId: string;
|
|
32
50
|
/** Provider that executed the code */
|
|
33
51
|
provider: string;
|
|
52
|
+
/** Process ID for background jobs (if applicable) */
|
|
53
|
+
pid?: number;
|
|
54
|
+
/** Whether this command is running in background */
|
|
55
|
+
isBackground?: boolean;
|
|
34
56
|
}
|
|
35
57
|
/**
|
|
36
58
|
* Information about a sandbox
|
|
@@ -135,7 +157,7 @@ interface Sandbox {
|
|
|
135
157
|
/** Execute code in the sandbox */
|
|
136
158
|
runCode(code: string, runtime?: Runtime): Promise<ExecutionResult>;
|
|
137
159
|
/** Execute shell commands */
|
|
138
|
-
runCommand(command: string, args?: string[]): Promise<ExecutionResult>;
|
|
160
|
+
runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult>;
|
|
139
161
|
/** Get information about the sandbox */
|
|
140
162
|
getInfo(): Promise<SandboxInfo>;
|
|
141
163
|
/** Get URL for accessing the sandbox on a specific port */
|
|
@@ -154,12 +176,16 @@ interface Sandbox {
|
|
|
154
176
|
/** File system operations */
|
|
155
177
|
readonly filesystem: SandboxFileSystem;
|
|
156
178
|
}
|
|
157
|
-
|
|
158
179
|
/**
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
* Types related to provider configuration, authentication, and resource management
|
|
180
|
+
* Typed sandbox interface that preserves the provider's native instance type
|
|
162
181
|
*/
|
|
182
|
+
interface TypedSandbox<TProvider extends Provider$1> extends Sandbox {
|
|
183
|
+
/** Get the provider instance that created this sandbox with proper typing */
|
|
184
|
+
getProvider(): TProvider;
|
|
185
|
+
/** Get the native provider sandbox instance with proper typing */
|
|
186
|
+
getInstance(): ExtractSandboxInstanceType<TProvider>;
|
|
187
|
+
getInstance<T>(): T;
|
|
188
|
+
}
|
|
163
189
|
|
|
164
190
|
/**
|
|
165
191
|
* Provider sandbox management interface
|
|
@@ -186,11 +212,11 @@ interface Provider {
|
|
|
186
212
|
/**
|
|
187
213
|
* Configuration for the compute singleton
|
|
188
214
|
*/
|
|
189
|
-
interface ComputeConfig {
|
|
215
|
+
interface ComputeConfig<TProvider extends Provider = Provider> {
|
|
190
216
|
/** Default provider to use when none is specified */
|
|
191
|
-
defaultProvider?:
|
|
217
|
+
defaultProvider?: TProvider;
|
|
192
218
|
/** @deprecated Use defaultProvider instead. Kept for backwards compatibility */
|
|
193
|
-
provider?:
|
|
219
|
+
provider?: TProvider;
|
|
194
220
|
}
|
|
195
221
|
/**
|
|
196
222
|
* Parameters for compute.sandbox.create()
|
|
@@ -211,11 +237,11 @@ interface CreateSandboxParamsWithOptionalProvider {
|
|
|
211
237
|
options?: CreateSandboxOptions;
|
|
212
238
|
}
|
|
213
239
|
/**
|
|
214
|
-
* Compute
|
|
240
|
+
* Base Compute API interface (non-generic)
|
|
215
241
|
*/
|
|
216
242
|
interface ComputeAPI {
|
|
217
243
|
/** Configuration management */
|
|
218
|
-
setConfig(config: ComputeConfig): void;
|
|
244
|
+
setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void;
|
|
219
245
|
getConfig(): ComputeConfig | null;
|
|
220
246
|
clearConfig(): void;
|
|
221
247
|
sandbox: {
|
|
@@ -229,6 +255,23 @@ interface ComputeAPI {
|
|
|
229
255
|
destroy(providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void>;
|
|
230
256
|
};
|
|
231
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Typed Compute API interface that preserves provider type information
|
|
260
|
+
*/
|
|
261
|
+
interface TypedComputeAPI<TProvider extends Provider> extends Omit<ComputeAPI, 'sandbox' | 'setConfig'> {
|
|
262
|
+
/** Configuration management that returns typed compute instance */
|
|
263
|
+
setConfig<T extends Provider>(config: ComputeConfig<T>): TypedComputeAPI<T>;
|
|
264
|
+
sandbox: {
|
|
265
|
+
/** Create a sandbox from the configured provider with proper typing */
|
|
266
|
+
create(params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>): Promise<TypedSandbox<TProvider>>;
|
|
267
|
+
/** Get an existing sandbox by ID from the configured provider with proper typing */
|
|
268
|
+
getById(sandboxId: string): Promise<TypedSandbox<TProvider> | null>;
|
|
269
|
+
/** List all active sandboxes from the configured provider with proper typing */
|
|
270
|
+
list(): Promise<TypedSandbox<TProvider>[]>;
|
|
271
|
+
/** Destroy a sandbox via the configured provider */
|
|
272
|
+
destroy(sandboxId: string): Promise<void>;
|
|
273
|
+
};
|
|
274
|
+
}
|
|
232
275
|
|
|
233
276
|
/**
|
|
234
277
|
* Compute Singleton - Main API Orchestrator
|
|
@@ -237,9 +280,27 @@ interface ComputeAPI {
|
|
|
237
280
|
*/
|
|
238
281
|
|
|
239
282
|
/**
|
|
240
|
-
* Singleton instance - the main API
|
|
283
|
+
* Singleton instance - the main API (untyped)
|
|
241
284
|
*/
|
|
242
285
|
declare const compute: ComputeAPI;
|
|
286
|
+
/**
|
|
287
|
+
* Create a compute instance with proper typing
|
|
288
|
+
* This enables proper type inference for getInstance() calls
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```typescript
|
|
292
|
+
* import { e2b } from '@computesdk/e2b'
|
|
293
|
+
* import { createCompute } from 'computesdk'
|
|
294
|
+
*
|
|
295
|
+
* const compute = createCompute({
|
|
296
|
+
* defaultProvider: e2b({ apiKey: 'your-key' }),
|
|
297
|
+
* });
|
|
298
|
+
*
|
|
299
|
+
* const sandbox = await compute.sandbox.create();
|
|
300
|
+
* const instance = sandbox.getInstance(); // ✅ Properly typed!
|
|
301
|
+
* ```
|
|
302
|
+
*/
|
|
303
|
+
declare function createCompute<TProvider extends Provider>(config: ComputeConfig<TProvider>): TypedComputeAPI<TProvider>;
|
|
243
304
|
|
|
244
305
|
/**
|
|
245
306
|
* Simplified Request Handler for Web Framework Integration
|
|
@@ -262,6 +323,10 @@ interface ComputeRequest {
|
|
|
262
323
|
runtime?: Runtime;
|
|
263
324
|
path?: string;
|
|
264
325
|
content?: string;
|
|
326
|
+
/** Command options (for runCommand action) */
|
|
327
|
+
commandOptions?: {
|
|
328
|
+
background?: boolean;
|
|
329
|
+
};
|
|
265
330
|
/** Sandbox creation options */
|
|
266
331
|
options?: {
|
|
267
332
|
runtime?: Runtime;
|
|
@@ -299,6 +364,15 @@ interface HandleComputeRequestParams {
|
|
|
299
364
|
* from simple method definitions with automatic feature detection.
|
|
300
365
|
*/
|
|
301
366
|
|
|
367
|
+
/**
|
|
368
|
+
* Helper function to handle background command execution
|
|
369
|
+
* Providers can use this to implement background job support
|
|
370
|
+
*/
|
|
371
|
+
declare function createBackgroundCommand(command: string, args?: string[], options?: RunCommandOptions): {
|
|
372
|
+
command: string;
|
|
373
|
+
args: string[];
|
|
374
|
+
isBackground: boolean;
|
|
375
|
+
};
|
|
302
376
|
/**
|
|
303
377
|
* Flat sandbox method implementations - all operations in one place
|
|
304
378
|
*/
|
|
@@ -317,7 +391,7 @@ interface SandboxMethods<TSandbox = any, TConfig = any> {
|
|
|
317
391
|
}>>;
|
|
318
392
|
destroy: (config: TConfig, sandboxId: string) => Promise<void>;
|
|
319
393
|
runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;
|
|
320
|
-
runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>;
|
|
394
|
+
runCommand: (sandbox: TSandbox, command: string, args?: string[], options?: RunCommandOptions) => Promise<ExecutionResult>;
|
|
321
395
|
getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;
|
|
322
396
|
getUrl: (sandbox: TSandbox, options: {
|
|
323
397
|
port: number;
|
|
@@ -350,4 +424,4 @@ interface ProviderConfig<TSandbox = any, TConfig = any> {
|
|
|
350
424
|
*/
|
|
351
425
|
declare function createProvider<TSandbox, TConfig>(providerConfig: ProviderConfig<TSandbox, TConfig>): (config: TConfig) => Provider;
|
|
352
426
|
|
|
353
|
-
export { CommandExitError, type ComputeAPI, type ComputeConfig, type ComputeRequest, type ComputeResponse, type CreateSandboxOptions, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type ExecutionResult, type FileEntry, type HandleComputeRequestParams, type Provider, type ProviderConfig, type ProviderSandboxManager, type Runtime, type Sandbox, type SandboxFileSystem, type SandboxInfo, type SandboxMethods, type SandboxStatus, compute, createProvider, handleComputeRequest, isCommandExitError };
|
|
427
|
+
export { CommandExitError, type ComputeAPI, type ComputeConfig, type ComputeRequest, type ComputeResponse, type CreateSandboxOptions, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type ExecutionResult, type ExtractSandboxInstanceType, type FileEntry, type HandleComputeRequestParams, type Provider, type ProviderConfig, type ProviderSandboxManager, type RunCommandOptions, type Runtime, type Sandbox, type SandboxFileSystem, type SandboxInfo, type SandboxMethods, type SandboxStatus, type TypedComputeAPI, type TypedSandbox, compute, createBackgroundCommand, createCompute, createProvider, handleComputeRequest, isCommandExitError };
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,8 @@ var index_exports = {};
|
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
CommandExitError: () => CommandExitError,
|
|
24
24
|
compute: () => compute,
|
|
25
|
+
createBackgroundCommand: () => createBackgroundCommand,
|
|
26
|
+
createCompute: () => createCompute,
|
|
25
27
|
createProvider: () => createProvider,
|
|
26
28
|
handleComputeRequest: () => handleComputeRequest,
|
|
27
29
|
isCommandExitError: () => isCommandExitError
|
|
@@ -44,6 +46,7 @@ function isCommandExitError(error) {
|
|
|
44
46
|
var ComputeManager = class {
|
|
45
47
|
constructor() {
|
|
46
48
|
this.config = null;
|
|
49
|
+
this.typedState = { isTyped: false, provider: null };
|
|
47
50
|
this.sandbox = {
|
|
48
51
|
/**
|
|
49
52
|
* Create a sandbox from a provider (or default provider if configured)
|
|
@@ -67,7 +70,11 @@ var ComputeManager = class {
|
|
|
67
70
|
create: async (params) => {
|
|
68
71
|
const provider = params && "provider" in params && params.provider ? params.provider : this.getDefaultProvider();
|
|
69
72
|
const options = params?.options;
|
|
70
|
-
|
|
73
|
+
const sandbox = await provider.sandbox.create(options);
|
|
74
|
+
if (this.typedState.isTyped && (!params || !("provider" in params && params.provider))) {
|
|
75
|
+
return sandbox;
|
|
76
|
+
}
|
|
77
|
+
return sandbox;
|
|
71
78
|
},
|
|
72
79
|
/**
|
|
73
80
|
* Get an existing sandbox by ID from a provider (or default provider if configured)
|
|
@@ -75,7 +82,11 @@ var ComputeManager = class {
|
|
|
75
82
|
getById: async (providerOrSandboxId, sandboxId) => {
|
|
76
83
|
if (typeof providerOrSandboxId === "string") {
|
|
77
84
|
const provider = this.getDefaultProvider();
|
|
78
|
-
|
|
85
|
+
const sandbox = await provider.sandbox.getById(providerOrSandboxId);
|
|
86
|
+
if (this.typedState.isTyped && sandbox) {
|
|
87
|
+
return sandbox;
|
|
88
|
+
}
|
|
89
|
+
return sandbox;
|
|
79
90
|
} else {
|
|
80
91
|
if (!sandboxId) {
|
|
81
92
|
throw new Error("sandboxId is required when provider is specified");
|
|
@@ -88,7 +99,11 @@ var ComputeManager = class {
|
|
|
88
99
|
*/
|
|
89
100
|
list: async (provider) => {
|
|
90
101
|
const actualProvider = provider || this.getDefaultProvider();
|
|
91
|
-
|
|
102
|
+
const sandboxes = await actualProvider.sandbox.list();
|
|
103
|
+
if (this.typedState.isTyped && !provider) {
|
|
104
|
+
return sandboxes;
|
|
105
|
+
}
|
|
106
|
+
return sandboxes;
|
|
92
107
|
},
|
|
93
108
|
/**
|
|
94
109
|
* Destroy a sandbox via a provider (or default provider if configured)
|
|
@@ -107,7 +122,7 @@ var ComputeManager = class {
|
|
|
107
122
|
};
|
|
108
123
|
}
|
|
109
124
|
/**
|
|
110
|
-
* Set default configuration
|
|
125
|
+
* Set default configuration with generic type preservation
|
|
111
126
|
*/
|
|
112
127
|
setConfig(config) {
|
|
113
128
|
if (!config.defaultProvider && !config.provider) {
|
|
@@ -121,6 +136,10 @@ var ComputeManager = class {
|
|
|
121
136
|
provider: actualProvider,
|
|
122
137
|
defaultProvider: actualProvider
|
|
123
138
|
};
|
|
139
|
+
this.typedState = {
|
|
140
|
+
isTyped: true,
|
|
141
|
+
provider: actualProvider
|
|
142
|
+
};
|
|
124
143
|
}
|
|
125
144
|
/**
|
|
126
145
|
* Get current configuration
|
|
@@ -138,12 +157,13 @@ var ComputeManager = class {
|
|
|
138
157
|
* Get the default provider, throwing if not configured
|
|
139
158
|
*/
|
|
140
159
|
getDefaultProvider() {
|
|
141
|
-
|
|
160
|
+
const provider = this.config?.defaultProvider || this.config?.provider;
|
|
161
|
+
if (!provider) {
|
|
142
162
|
throw new Error(
|
|
143
163
|
"No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly."
|
|
144
164
|
);
|
|
145
165
|
}
|
|
146
|
-
return
|
|
166
|
+
return provider;
|
|
147
167
|
}
|
|
148
168
|
// Future: compute.blob.*, compute.database.*, compute.git.* will be added here
|
|
149
169
|
// blob = new BlobManager();
|
|
@@ -151,6 +171,40 @@ var ComputeManager = class {
|
|
|
151
171
|
// git = new GitManager();
|
|
152
172
|
};
|
|
153
173
|
var compute = new ComputeManager();
|
|
174
|
+
function createCompute(config) {
|
|
175
|
+
const manager = new ComputeManager();
|
|
176
|
+
const actualProvider = config.defaultProvider || config.provider;
|
|
177
|
+
manager["config"] = {
|
|
178
|
+
provider: actualProvider,
|
|
179
|
+
defaultProvider: actualProvider
|
|
180
|
+
};
|
|
181
|
+
manager["typedState"] = {
|
|
182
|
+
isTyped: true,
|
|
183
|
+
provider: actualProvider
|
|
184
|
+
};
|
|
185
|
+
return {
|
|
186
|
+
setConfig: (cfg) => createCompute(cfg),
|
|
187
|
+
getConfig: () => manager.getConfig(),
|
|
188
|
+
clearConfig: () => manager.clearConfig(),
|
|
189
|
+
sandbox: {
|
|
190
|
+
create: async (params) => {
|
|
191
|
+
const sandbox = await manager.sandbox.create(params);
|
|
192
|
+
return sandbox;
|
|
193
|
+
},
|
|
194
|
+
getById: async (sandboxId) => {
|
|
195
|
+
const sandbox = await manager.sandbox.getById(sandboxId);
|
|
196
|
+
return sandbox ? sandbox : null;
|
|
197
|
+
},
|
|
198
|
+
list: async () => {
|
|
199
|
+
const sandboxes = await manager.sandbox.list();
|
|
200
|
+
return sandboxes;
|
|
201
|
+
},
|
|
202
|
+
destroy: async (sandboxId) => {
|
|
203
|
+
return await manager.sandbox.destroy(sandboxId);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
154
208
|
|
|
155
209
|
// src/request-handler.ts
|
|
156
210
|
async function executeAction(body, provider) {
|
|
@@ -231,7 +285,7 @@ async function executeAction(body, provider) {
|
|
|
231
285
|
}
|
|
232
286
|
if (action === "compute.sandbox.runCommand") {
|
|
233
287
|
if (!body.command) throw new Error("command is required");
|
|
234
|
-
const result = await sandbox.runCommand(body.command, body.args);
|
|
288
|
+
const result = await sandbox.runCommand(body.command, body.args, body.commandOptions);
|
|
235
289
|
return {
|
|
236
290
|
success: true,
|
|
237
291
|
sandboxId,
|
|
@@ -240,7 +294,9 @@ async function executeAction(body, provider) {
|
|
|
240
294
|
stdout: result.stdout,
|
|
241
295
|
stderr: result.stderr,
|
|
242
296
|
exitCode: result.exitCode,
|
|
243
|
-
executionTime: result.executionTime
|
|
297
|
+
executionTime: result.executionTime,
|
|
298
|
+
...result.isBackground && { isBackground: result.isBackground },
|
|
299
|
+
...result.pid && { pid: result.pid }
|
|
244
300
|
}
|
|
245
301
|
};
|
|
246
302
|
}
|
|
@@ -354,6 +410,17 @@ async function handleComputeRequest(paramsOrRequestOrBody, provider) {
|
|
|
354
410
|
}
|
|
355
411
|
|
|
356
412
|
// src/factory.ts
|
|
413
|
+
function createBackgroundCommand(command, args = [], options) {
|
|
414
|
+
if (!options?.background) {
|
|
415
|
+
return { command, args, isBackground: false };
|
|
416
|
+
}
|
|
417
|
+
const fullCommand = args.length > 0 ? `${command} ${args.join(" ")}` : command;
|
|
418
|
+
return {
|
|
419
|
+
command: "sh",
|
|
420
|
+
args: ["-c", `${fullCommand} &`],
|
|
421
|
+
isBackground: true
|
|
422
|
+
};
|
|
423
|
+
}
|
|
357
424
|
var defaultFilesystemMethods = {
|
|
358
425
|
readFile: async (sandbox, path, runCommand) => {
|
|
359
426
|
const result = await runCommand(sandbox, "cat", [path]);
|
|
@@ -496,8 +563,8 @@ var GeneratedSandbox = class {
|
|
|
496
563
|
async runCode(code, runtime) {
|
|
497
564
|
return await this.methods.runCode(this.sandbox, code, runtime, this.config);
|
|
498
565
|
}
|
|
499
|
-
async runCommand(command, args) {
|
|
500
|
-
return await this.methods.runCommand(this.sandbox, command, args);
|
|
566
|
+
async runCommand(command, args, options) {
|
|
567
|
+
return await this.methods.runCommand(this.sandbox, command, args, options);
|
|
501
568
|
}
|
|
502
569
|
async getInfo() {
|
|
503
570
|
return await this.methods.getInfo(this.sandbox);
|
|
@@ -607,6 +674,8 @@ function createProvider(providerConfig) {
|
|
|
607
674
|
0 && (module.exports = {
|
|
608
675
|
CommandExitError,
|
|
609
676
|
compute,
|
|
677
|
+
createBackgroundCommand,
|
|
678
|
+
createCompute,
|
|
610
679
|
createProvider,
|
|
611
680
|
handleComputeRequest,
|
|
612
681
|
isCommandExitError
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types/sandbox.ts","../src/compute.ts","../src/request-handler.ts","../src/factory.ts"],"sourcesContent":["/**\n * ComputeSDK Core\n * \n * Clean Provider/Sandbox separation architecture with extensible compute.* API\n */\n\n// Export all types\nexport * from './types';\n\n// Export compute singleton - the main API\nexport { compute } from './compute';\n\n// Export request handler for web framework integration\nexport { handleComputeRequest } from './request-handler';\n\n// Export compute request/response types\nexport type {\n ComputeRequest,\n ComputeResponse,\n HandleComputeRequestParams\n} from './request-handler';\n\n\n\n// Export provider factory for creating custom providers\nexport { createProvider } from './factory';\nexport type { ProviderConfig, SandboxMethods } from './factory';\n\n// Export error handling utilities (explicitly for clarity)\nexport { CommandExitError, isCommandExitError } from './types/sandbox';\n\n// Test suite is available separately via @computesdk/test-utils package\n","/**\n * Sandbox Types\n * \n * Types related to sandbox execution, filesystem, terminal operations\n */\n\n// Forward declaration to avoid circular dependency\ninterface Provider {\n readonly name: string;\n readonly sandbox: any; // Will be properly typed when imported together\n}\n\n/**\n * Supported runtime environments\n */\nexport type Runtime = 'node' | 'python';\n\n/**\n * Sandbox status types\n */\nexport type SandboxStatus = 'running' | 'stopped' | 'error';\n\n/**\n * Result of code execution\n */\nexport interface ExecutionResult {\n /** Standard output from the execution */\n stdout: string;\n /** Standard error from the execution */\n stderr: string;\n /** Exit code from the execution */\n exitCode: number;\n /** Time taken for execution in milliseconds */\n executionTime: number;\n /** ID of the sandbox where the code was executed */\n sandboxId: string;\n /** Provider that executed the code */\n provider: string;\n}\n\n/**\n * Information about a sandbox\n */\nexport interface SandboxInfo {\n /** Unique identifier for the sandbox */\n id: string;\n /** Provider hosting the sandbox */\n provider: string;\n /** Runtime environment in the sandbox */\n runtime: Runtime;\n /** Current status of the sandbox */\n status: SandboxStatus;\n /** When the sandbox was created */\n createdAt: Date;\n /** Execution timeout in milliseconds */\n timeout: number;\n /** Additional provider-specific metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Options for creating a sandbox\n */\nexport interface CreateSandboxOptions {\n /** Runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Custom sandbox ID (if supported by provider) */\n sandboxId?: string;\n /** Template ID for sandbox creation (provider-specific) */\n templateId?: string;\n /** Additional metadata for the sandbox */\n metadata?: Record<string, any>;\n /** Domain for sandbox connection (provider-specific) */\n domain?: string;\n /** Environment variables for the sandbox */\n envs?: Record<string, string>;\n}\n\n/**\n * File system entry information\n */\nexport interface FileEntry {\n /** File/directory name */\n name: string;\n /** Full path to the entry */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** File size in bytes (0 for directories) */\n size: number;\n /** Last modified timestamp */\n lastModified: Date;\n}\n\n/**\n * File system interface for sandbox operations\n */\nexport interface SandboxFileSystem {\n /** Read file contents */\n readFile(path: string): Promise<string>;\n /** Write file contents */\n writeFile(path: string, content: string): Promise<void>;\n /** Create directory */\n mkdir(path: string): Promise<void>;\n /** List directory contents */\n readdir(path: string): Promise<FileEntry[]>;\n /** Check if file/directory exists */\n exists(path: string): Promise<boolean>;\n /** Remove file or directory */\n remove(path: string): Promise<void>;\n}\n\n/**\n * Error thrown when a command exits with a non-zero status\n */\nexport class CommandExitError extends Error {\n name = 'CommandExitError';\n constructor(public result: {\n exitCode: number;\n stdout: string;\n stderr: string;\n error: boolean;\n }) {\n super(`Command exited with code ${result.exitCode}`);\n }\n}\n\n/**\n * Type guard to check if an error is a CommandExitError\n */\nexport function isCommandExitError(error: unknown): error is CommandExitError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'CommandExitError' &&\n 'result' in error\n );\n}\n\n\n\n\n\n/**\n * Base sandbox interface - what developers interact with\n */\nexport interface Sandbox {\n /** Unique identifier for the sandbox */\n readonly sandboxId: string;\n /** Provider that created this sandbox */\n readonly provider: string;\n\n /** Execute code in the sandbox */\n runCode(code: string, runtime?: Runtime): Promise<ExecutionResult>;\n /** Execute shell commands */\n runCommand(command: string, args?: string[]): Promise<ExecutionResult>;\n /** Get information about the sandbox */\n getInfo(): Promise<SandboxInfo>;\n /** Get URL for accessing the sandbox on a specific port */\n getUrl(options: { port: number; protocol?: string }): Promise<string>;\n /** Get the provider instance that created this sandbox */\n getProvider(): Provider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance<T = any>(): T;\n /** Kill the sandbox */\n kill(): Promise<void>;\n /** Destroy the sandbox and clean up resources */\n destroy(): Promise<void>;\n\n /** File system operations */\n readonly filesystem: SandboxFileSystem;\n}","/**\n * Compute Singleton - Main API Orchestrator\n * \n * Provides the unified compute.* API and delegates to specialized managers\n */\n\nimport type { ComputeAPI, CreateSandboxParams, CreateSandboxParamsWithOptionalProvider, ComputeConfig, Sandbox, Provider } from './types';\n\n/**\n * Compute singleton implementation - orchestrates all compute operations\n */\nclass ComputeManager implements ComputeAPI {\n private config: ComputeConfig | null = null;\n\n /**\n * Set default configuration\n */\n setConfig(config: ComputeConfig): void {\n // Validate that at least one provider is specified\n if (!config.defaultProvider && !config.provider) {\n throw new Error('Either defaultProvider or provider must be specified in setConfig');\n }\n \n // Handle backwards compatibility: if both are provided, defaultProvider takes precedence\n if (config.defaultProvider && config.provider) {\n console.warn('Both defaultProvider and provider specified in setConfig. Using defaultProvider. The provider key is deprecated, please use defaultProvider instead.');\n }\n \n // Normalize config to always have provider for internal use (for backwards compatibility)\n const actualProvider = config.defaultProvider || config.provider!;\n this.config = {\n provider: actualProvider,\n defaultProvider: actualProvider\n };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ComputeConfig | null {\n return this.config;\n }\n\n /**\n * Clear current configuration\n */\n clearConfig(): void {\n this.config = null;\n }\n\n /**\n * Get the default provider, throwing if not configured\n */\n private getDefaultProvider(): Provider {\n if (!this.config?.provider) {\n throw new Error(\n 'No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly.'\n );\n }\n return this.config.provider;\n }\n\n sandbox = {\n /**\n * Create a sandbox from a provider (or default provider if configured)\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { compute } from 'computesdk'\n * \n * // With explicit provider\n * const sandbox = await compute.sandbox.create({\n * provider: e2b({ apiKey: 'your-key' })\n * })\n * \n * // With default provider (both forms work)\n * compute.setConfig({ defaultProvider: e2b({ apiKey: 'your-key' }) })\n * const sandbox1 = await compute.sandbox.create({})\n * const sandbox2 = await compute.sandbox.create()\n * ```\n */\n create: async (params?: CreateSandboxParams | CreateSandboxParamsWithOptionalProvider): Promise<Sandbox> => {\n const provider = params && 'provider' in params && params.provider ? params.provider : this.getDefaultProvider();\n const options = params?.options;\n return await provider.sandbox.create(options);\n },\n\n /**\n * Get an existing sandbox by ID from a provider (or default provider if configured)\n */\n getById: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<Sandbox | null> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.getById(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.getById(sandboxId);\n }\n },\n\n /**\n * List all active sandboxes from a provider (or default provider if configured)\n */\n list: async (provider?: Provider): Promise<Sandbox[]> => {\n const actualProvider = provider || this.getDefaultProvider();\n return await actualProvider.sandbox.list();\n },\n\n /**\n * Destroy a sandbox via a provider (or default provider if configured)\n */\n destroy: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.destroy(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.destroy(sandboxId);\n }\n }\n };\n\n // Future: compute.blob.*, compute.database.*, compute.git.* will be added here\n // blob = new BlobManager();\n // database = new DatabaseManager(); \n // git = new GitManager();\n\n\n}\n\n/**\n * Singleton instance - the main API\n */\nexport const compute: ComputeAPI = new ComputeManager();\n\n","/**\n * Simplified Request Handler for Web Framework Integration\n * \n * Handles JSON requests for sandbox and code execution operations.\n * Terminal support removed - will be re-added with WebSocket VM connections.\n */\n\nimport type { Provider, Runtime } from './types';\nimport { compute } from './compute';\n\n/**\n * Request structure supporting sandbox and code execution capabilities\n */\nexport interface ComputeRequest {\n /** Action in dot notation (e.g., 'compute.sandbox.create') */\n action: string;\n \n /** Parameters for the action */\n sandboxId?: string;\n code?: string;\n command?: string;\n args?: string[];\n runtime?: Runtime;\n path?: string;\n content?: string;\n \n /** Sandbox creation options */\n options?: {\n runtime?: Runtime;\n timeout?: number;\n sandboxId?: string;\n };\n}\n\n/**\n * Response structure for compute operations\n */\nexport interface ComputeResponse {\n success: boolean;\n error?: string;\n sandboxId: string;\n provider: string;\n [key: string]: any; // Allow any additional response data\n}\n\n/**\n * Execute compute action using targeted handling\n */\nasync function executeAction(body: ComputeRequest, provider: Provider): Promise<ComputeResponse> {\n try {\n const { action, sandboxId } = body;\n \n // Sandbox management operations\n if (action === 'compute.sandbox.create') {\n const sandbox = await compute.sandbox.create({\n provider,\n options: body.options || { runtime: 'python' }\n });\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name\n };\n }\n \n if (action === 'compute.sandbox.list') {\n const sandboxes = await compute.sandbox.list(provider);\n return {\n success: true,\n sandboxId: '',\n provider: provider.name,\n sandboxes: sandboxes.map(sb => ({\n sandboxId: sb.sandboxId,\n provider: sb.provider\n }))\n };\n }\n \n if (action === 'compute.sandbox.destroy') {\n if (!sandboxId) {\n throw new Error('sandboxId is required for destroy action');\n }\n await compute.sandbox.destroy(provider, sandboxId);\n return {\n success: true,\n sandboxId,\n provider: provider.name\n };\n }\n \n // For sandbox instance methods, get the sandbox first\n if (!sandboxId) {\n throw new Error('sandboxId is required for this action');\n }\n \n const sandbox = await compute.sandbox.getById(provider, sandboxId);\n if (!sandbox) {\n throw new Error(`Sandbox ${sandboxId} not found`);\n }\n \n // Sandbox info\n if (action === 'compute.sandbox.getInfo') {\n const result = await sandbox.getInfo();\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n info: {\n id: result.id,\n provider: result.provider,\n runtime: result.runtime,\n status: result.status,\n createdAt: result.createdAt.toISOString(),\n timeout: result.timeout,\n metadata: result.metadata\n }\n };\n }\n \n // Code execution\n if (action === 'compute.sandbox.runCode') {\n if (!body.code) throw new Error('code is required');\n const result = await sandbox.runCode(body.code, body.runtime);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n \n if (action === 'compute.sandbox.runCommand') {\n if (!body.command) throw new Error('command is required');\n const result = await sandbox.runCommand(body.command, body.args);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n \n // Filesystem operations\n if (action === 'compute.sandbox.filesystem.readFile') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readFile(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n fileContent: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.writeFile') {\n if (!body.path) throw new Error('path is required');\n if (body.content === undefined) throw new Error('content is required');\n await sandbox.filesystem.writeFile(body.path, body.content);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.mkdir') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.mkdir(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.readdir') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readdir(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n files: result.map((entry: any) => ({\n name: entry.name,\n path: entry.path,\n isDirectory: entry.isDirectory,\n size: entry.size,\n lastModified: entry.lastModified.toISOString()\n }))\n };\n }\n \n if (action === 'compute.sandbox.filesystem.exists') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.exists(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n exists: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.remove') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.remove(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n throw new Error(`Unknown action: ${action}`);\n \n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n sandboxId: body.sandboxId || '',\n provider: provider.name\n };\n }\n}\n\n/**\n * Main request handler - handles HTTP requests and pre-parsed bodies\n */\nexport async function handleComputeRequest(\n params: HandleComputeRequestParams\n): Promise<ComputeResponse>;\nexport async function handleComputeRequest(\n requestOrBody: Request | ComputeRequest,\n provider: Provider\n): Promise<Response>;\nexport async function handleComputeRequest(\n paramsOrRequestOrBody: HandleComputeRequestParams | Request | ComputeRequest,\n provider?: Provider\n): Promise<ComputeResponse | Response> {\n // Handle object-style API\n if (typeof paramsOrRequestOrBody === 'object' && 'request' in paramsOrRequestOrBody && 'provider' in paramsOrRequestOrBody) {\n const params = paramsOrRequestOrBody as HandleComputeRequestParams;\n return await executeAction(params.request, params.provider);\n }\n \n // Handle original API\n if (!provider) {\n throw new Error('Provider is required when not using object-style API');\n }\n \n const requestOrBody = paramsOrRequestOrBody as Request | ComputeRequest;\n try {\n let body: ComputeRequest;\n \n if (requestOrBody instanceof Request) {\n // Handle HTTP method validation\n if (requestOrBody.method !== 'POST') {\n return Response.json({\n success: false,\n error: 'Only POST requests are supported',\n sandboxId: '',\n provider: provider.name\n }, { status: 405 });\n }\n \n // Parse JSON body with better error handling\n try {\n body = await requestOrBody.json();\n } catch (parseError) {\n return Response.json({\n success: false,\n error: 'Invalid JSON in request body',\n sandboxId: '',\n provider: provider.name\n }, { status: 400 });\n }\n } else {\n body = requestOrBody;\n }\n \n // Execute the action\n const result = await executeAction(body, provider);\n \n return Response.json(result, {\n status: result.success ? 200 : 500\n });\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Request handling failed',\n sandboxId: '',\n provider: provider.name\n }, { status: 500 });\n }\n}\n\n/**\n * Legacy export for backward compatibility\n */\nexport interface HandleComputeRequestParams {\n request: ComputeRequest;\n provider: Provider;\n}\n\nexport { handleComputeRequest as handleHttpComputeRequest };","/**\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\nimport type {\n Provider,\n ProviderSandboxManager,\n Sandbox,\n SandboxFileSystem,\n SandboxInfo,\n ExecutionResult,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\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 // Instance operations (map to individual Sandbox methods)\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;\n runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>;\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, args?: string[]) => Promise<ExecutionResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n };\n \n\n}\n\n/**\n * Provider configuration for createProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n };\n}\n\n/**\n * Default filesystem implementations based on shell commands\n * These work for any provider that supports shell command execution\n */\nconst defaultFilesystemMethods = {\n readFile: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<string> => {\n const result = await runCommand(sandbox, 'cat', [path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n }\n // Trim trailing newline that cat command adds\n return result.stdout.replace(/\\n$/, '');\n },\n\n writeFile: async (sandbox: any, path: string, content: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'sh', ['-c', `echo ${JSON.stringify(content)} > ${JSON.stringify(path)}`]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'mkdir', ['-p', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<FileEntry[]> => {\n // Try different ls variations for maximum compatibility\n let result = await runCommand(sandbox, 'ls', ['-la', path]);\n let hasDetailedOutput = true;\n \n // Fall back to basic ls if detailed flags not supported\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', ['-l', path]);\n }\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', [path]);\n hasDetailedOutput = false;\n }\n \n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n\n const lines = (result.stdout || '').split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n if (hasDetailedOutput && line.includes(' ')) {\n // Parse detailed ls output (ls -la or ls -l)\n const parts = line.trim().split(/\\s+/);\n const name = parts[parts.length - 1];\n const isDirectory = line.startsWith('d');\n \n return {\n name,\n path: `${path}/${name}`,\n isDirectory,\n size: parseInt(parts[4]) || 0,\n lastModified: new Date()\n };\n } else {\n // Parse simple ls output (just filenames)\n const name = line.trim();\n return {\n name,\n path: `${path}/${name}`,\n isDirectory: false, // Can't determine from simple ls\n size: 0,\n lastModified: new Date()\n };\n }\n });\n },\n\n exists: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<boolean> => {\n const result = await runCommand(sandbox, 'test', ['-e', path]);\n return result.exitCode === 0; // Exit code 0 means file exists\n },\n\n remove: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'rm', ['-rf', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\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 Sandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements Sandbox {\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 getInstance<T extends TSandbox>(): T;\n getInstance<T extends TSandbox = TSandbox>(): T {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox) as T;\n }\n // Fallback to generic casting\n return this.sandbox as T;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<ExecutionResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(command: string, args?: string[]): Promise<ExecutionResult> {\n return await this.methods.runCommand(this.sandbox, command, args);\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 {\n return this.providerInstance;\n }\n\n async kill(): Promise<void> {\n // For backward compatibility, kill() delegates to destroy()\n await this.destroy();\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 {\n private activeSandboxes: Map<string, GeneratedSandbox<TSandbox>> = new Map();\n\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<Sandbox> {\n const result = await this.methods.create(this.config, options);\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async getById(sandboxId: string): Promise<Sandbox | null> {\n // Check active sandboxes first\n const existing = this.activeSandboxes.get(sandboxId);\n if (existing) {\n return existing;\n }\n\n // Try to reconnect\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async list(): Promise<Sandbox[]> {\n const results = await this.methods.list(this.config);\n const sandboxes: Sandbox[] = [];\n\n for (const result of results) {\n let sandbox = this.activeSandboxes.get(result.sandboxId);\n if (!sandbox) {\n sandbox = new GeneratedSandbox(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n this.activeSandboxes.set(result.sandboxId, sandbox);\n }\n sandboxes.push(sandbox);\n }\n\n return sandboxes;\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n this.activeSandboxes.delete(sandboxId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig> implements Provider {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\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 createProvider<TSandbox, TConfig>(\n providerConfig: ProviderConfig<TSandbox, TConfig>\n): (config: TConfig) => Provider {\n // Auto-inject default filesystem methods if none provided\n if (!providerConfig.methods.sandbox.filesystem) {\n providerConfig.methods.sandbox.filesystem = defaultFilesystemMethods;\n }\n\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}"],"mappings":"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","names":["sandbox"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types/sandbox.ts","../src/compute.ts","../src/request-handler.ts","../src/factory.ts"],"sourcesContent":["/**\n * ComputeSDK Core\n * \n * Clean Provider/Sandbox separation architecture with extensible compute.* API\n */\n\n// Export all types\nexport * from './types';\n\n// Export compute singleton - the main API\nexport { compute, createCompute } from './compute';\n\n// Export request handler for web framework integration\nexport { handleComputeRequest } from './request-handler';\n\n// Export compute request/response types\nexport type {\n ComputeRequest,\n ComputeResponse,\n HandleComputeRequestParams\n} from './request-handler';\n\n\n\n// Export provider factory for creating custom providers\nexport { createProvider, createBackgroundCommand } from './factory';\nexport type { ProviderConfig, SandboxMethods } from './factory';\n\n// Export error handling utilities (explicitly for clarity)\nexport { CommandExitError, isCommandExitError } from './types/sandbox';\n\n// Test suite is available separately via @computesdk/test-utils package\n","/**\n * Sandbox Types\n * \n * Types related to sandbox execution, filesystem, terminal operations\n */\n\n// Forward declaration to avoid circular dependency\ninterface Provider {\n readonly name: string;\n readonly sandbox: any; // Will be properly typed when imported together\n}\n\n/**\n * Utility type to extract the native instance type from a provider\n * This enables proper typing for getInstance() calls by looking at the provider's internal types\n */\nexport type ExtractSandboxInstanceType<TProvider extends Provider> = TProvider extends Provider ? \n TProvider extends { \n sandbox: { \n create(): Promise<infer TSandbox> \n } \n } ? (\n TSandbox extends { getInstance(): infer TInstance } \n ? TInstance \n : any\n ) : any : any;\n\n/**\n * Supported runtime environments\n */\nexport type Runtime = 'node' | 'python';\n\n/**\n * Sandbox status types\n */\nexport type SandboxStatus = 'running' | 'stopped' | 'error';\n\n/**\n * Options for running commands\n */\nexport interface RunCommandOptions {\n /** Run command in background (non-blocking) */\n background?: boolean;\n}\n\n/**\n * Result of code execution\n */\nexport interface ExecutionResult {\n /** Standard output from the execution */\n stdout: string;\n /** Standard error from the execution */\n stderr: string;\n /** Exit code from the execution */\n exitCode: number;\n /** Time taken for execution in milliseconds */\n executionTime: number;\n /** ID of the sandbox where the code was executed */\n sandboxId: string;\n /** Provider that executed the code */\n provider: string;\n /** Process ID for background jobs (if applicable) */\n pid?: number;\n /** Whether this command is running in background */\n isBackground?: boolean;\n}\n\n/**\n * Information about a sandbox\n */\nexport interface SandboxInfo {\n /** Unique identifier for the sandbox */\n id: string;\n /** Provider hosting the sandbox */\n provider: string;\n /** Runtime environment in the sandbox */\n runtime: Runtime;\n /** Current status of the sandbox */\n status: SandboxStatus;\n /** When the sandbox was created */\n createdAt: Date;\n /** Execution timeout in milliseconds */\n timeout: number;\n /** Additional provider-specific metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Options for creating a sandbox\n */\nexport interface CreateSandboxOptions {\n /** Runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Custom sandbox ID (if supported by provider) */\n sandboxId?: string;\n /** Template ID for sandbox creation (provider-specific) */\n templateId?: string;\n /** Additional metadata for the sandbox */\n metadata?: Record<string, any>;\n /** Domain for sandbox connection (provider-specific) */\n domain?: string;\n /** Environment variables for the sandbox */\n envs?: Record<string, string>;\n}\n\n/**\n * File system entry information\n */\nexport interface FileEntry {\n /** File/directory name */\n name: string;\n /** Full path to the entry */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** File size in bytes (0 for directories) */\n size: number;\n /** Last modified timestamp */\n lastModified: Date;\n}\n\n/**\n * File system interface for sandbox operations\n */\nexport interface SandboxFileSystem {\n /** Read file contents */\n readFile(path: string): Promise<string>;\n /** Write file contents */\n writeFile(path: string, content: string): Promise<void>;\n /** Create directory */\n mkdir(path: string): Promise<void>;\n /** List directory contents */\n readdir(path: string): Promise<FileEntry[]>;\n /** Check if file/directory exists */\n exists(path: string): Promise<boolean>;\n /** Remove file or directory */\n remove(path: string): Promise<void>;\n}\n\n/**\n * Error thrown when a command exits with a non-zero status\n */\nexport class CommandExitError extends Error {\n name = 'CommandExitError';\n constructor(public result: {\n exitCode: number;\n stdout: string;\n stderr: string;\n error: boolean;\n }) {\n super(`Command exited with code ${result.exitCode}`);\n }\n}\n\n/**\n * Type guard to check if an error is a CommandExitError\n */\nexport function isCommandExitError(error: unknown): error is CommandExitError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'CommandExitError' &&\n 'result' in error\n );\n}\n\n\n\n\n\n/**\n * Base sandbox interface - what developers interact with\n */\nexport interface Sandbox {\n /** Unique identifier for the sandbox */\n readonly sandboxId: string;\n /** Provider that created this sandbox */\n readonly provider: string;\n\n /** Execute code in the sandbox */\n runCode(code: string, runtime?: Runtime): Promise<ExecutionResult>;\n /** Execute shell commands */\n runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult>;\n /** Get information about the sandbox */\n getInfo(): Promise<SandboxInfo>;\n /** Get URL for accessing the sandbox on a specific port */\n getUrl(options: { port: number; protocol?: string }): Promise<string>;\n /** Get the provider instance that created this sandbox */\n getProvider(): Provider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance<T = any>(): T;\n /** Kill the sandbox */\n kill(): Promise<void>;\n /** Destroy the sandbox and clean up resources */\n destroy(): Promise<void>;\n\n /** File system operations */\n readonly filesystem: SandboxFileSystem;\n}\n\n/**\n * Typed sandbox interface that preserves the provider's native instance type\n */\nexport interface TypedSandbox<TProvider extends Provider> extends Sandbox {\n /** Get the provider instance that created this sandbox with proper typing */\n getProvider(): TProvider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance(): ExtractSandboxInstanceType<TProvider>;\n getInstance<T>(): T;\n}","/**\n * Compute Singleton - Main API Orchestrator\n * \n * Provides the unified compute.* API and delegates to specialized managers\n */\n\nimport type { ComputeAPI, CreateSandboxParams, CreateSandboxParamsWithOptionalProvider, ComputeConfig, Sandbox, Provider, TypedSandbox, TypedComputeAPI } from './types';\n\n/**\n * Compute singleton implementation - orchestrates all compute operations\n */\nclass ComputeManager implements ComputeAPI {\n private config: ComputeConfig | null = null;\n private typedState: { \n isTyped: boolean; \n provider: Provider | null; \n } = { isTyped: false, provider: null };\n\n /**\n * Set default configuration with generic type preservation\n */\n setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void {\n // Validate that at least one provider is specified\n if (!config.defaultProvider && !config.provider) {\n throw new Error('Either defaultProvider or provider must be specified in setConfig');\n }\n \n // Handle backwards compatibility: if both are provided, defaultProvider takes precedence\n if (config.defaultProvider && config.provider) {\n console.warn('Both defaultProvider and provider specified in setConfig. Using defaultProvider. The provider key is deprecated, please use defaultProvider instead.');\n }\n \n // Normalize config to always have both fields for internal use (backward compatibility)\n const actualProvider = config.defaultProvider || config.provider!;\n this.config = {\n provider: actualProvider,\n defaultProvider: actualProvider\n };\n\n // Store typed state for type-aware operations\n this.typedState = {\n isTyped: true,\n provider: actualProvider\n };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ComputeConfig | null {\n return this.config;\n }\n\n /**\n * Clear current configuration\n */\n clearConfig(): void {\n this.config = null;\n }\n\n /**\n * Get the default provider, throwing if not configured\n */\n private getDefaultProvider(): Provider {\n const provider = this.config?.defaultProvider || this.config?.provider;\n if (!provider) {\n throw new Error(\n 'No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly.'\n );\n }\n return provider;\n }\n\n sandbox = {\n /**\n * Create a sandbox from a provider (or default provider if configured)\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { compute } from 'computesdk'\n * \n * // With explicit provider\n * const sandbox = await compute.sandbox.create({\n * provider: e2b({ apiKey: 'your-key' })\n * })\n * \n * // With default provider (both forms work)\n * compute.setConfig({ defaultProvider: e2b({ apiKey: 'your-key' }) })\n * const sandbox1 = await compute.sandbox.create({})\n * const sandbox2 = await compute.sandbox.create()\n * ```\n */\n create: async (params?: CreateSandboxParams | CreateSandboxParamsWithOptionalProvider): Promise<Sandbox> => {\n const provider = params && 'provider' in params && params.provider ? params.provider : this.getDefaultProvider();\n const options = params?.options;\n const sandbox = await provider.sandbox.create(options);\n \n // If we have typed state and no explicit provider passed, cast to typed sandbox\n // This enables proper type inference for getInstance() when using default provider\n if (this.typedState.isTyped && (!params || !('provider' in params && params.provider))) {\n return sandbox as TypedSandbox<any>;\n }\n \n return sandbox;\n },\n\n /**\n * Get an existing sandbox by ID from a provider (or default provider if configured)\n */\n getById: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<Sandbox | null> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n const sandbox = await provider.sandbox.getById(providerOrSandboxId);\n \n // If we have typed state, cast to typed sandbox for proper getInstance() typing\n if (this.typedState.isTyped && sandbox) {\n return sandbox as TypedSandbox<any>;\n }\n \n return sandbox;\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.getById(sandboxId);\n }\n },\n\n /**\n * List all active sandboxes from a provider (or default provider if configured)\n */\n list: async (provider?: Provider): Promise<Sandbox[]> => {\n const actualProvider = provider || this.getDefaultProvider();\n const sandboxes = await actualProvider.sandbox.list();\n \n // If we have typed state and no explicit provider passed, cast to typed sandboxes\n if (this.typedState.isTyped && !provider) {\n return sandboxes as TypedSandbox<any>[];\n }\n \n return sandboxes;\n },\n\n /**\n * Destroy a sandbox via a provider (or default provider if configured)\n */\n destroy: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.destroy(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.destroy(sandboxId);\n }\n }\n };\n\n // Future: compute.blob.*, compute.database.*, compute.git.* will be added here\n // blob = new BlobManager();\n // database = new DatabaseManager(); \n // git = new GitManager();\n\n\n}\n\n/**\n * Singleton instance - the main API (untyped)\n */\nexport const compute: ComputeAPI = new ComputeManager();\n\n/**\n * Create a compute instance with proper typing\n * This enables proper type inference for getInstance() calls\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { createCompute } from 'computesdk'\n * \n * const compute = createCompute({\n * defaultProvider: e2b({ apiKey: 'your-key' }),\n * });\n * \n * const sandbox = await compute.sandbox.create();\n * const instance = sandbox.getInstance(); // ✅ Properly typed!\n * ```\n */\nexport function createCompute<TProvider extends Provider>(config: ComputeConfig<TProvider>): TypedComputeAPI<TProvider> {\n const manager = new ComputeManager();\n \n // Set config directly without calling the public setConfig method\n const actualProvider = config.defaultProvider || config.provider!;\n manager['config'] = {\n provider: actualProvider,\n defaultProvider: actualProvider\n };\n manager['typedState'] = {\n isTyped: true,\n provider: actualProvider\n };\n \n return {\n setConfig: <T extends Provider>(cfg: ComputeConfig<T>) => createCompute(cfg),\n getConfig: () => manager.getConfig(),\n clearConfig: () => manager.clearConfig(),\n \n sandbox: {\n create: async (params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>) => {\n const sandbox = await manager.sandbox.create(params);\n return sandbox as TypedSandbox<TProvider>;\n },\n \n getById: async (sandboxId: string) => {\n const sandbox = await manager.sandbox.getById(sandboxId);\n return sandbox ? sandbox as TypedSandbox<TProvider> : null;\n },\n \n list: async () => {\n const sandboxes = await manager.sandbox.list();\n return sandboxes as TypedSandbox<TProvider>[];\n },\n \n destroy: async (sandboxId: string) => {\n return await manager.sandbox.destroy(sandboxId);\n }\n }\n } as TypedComputeAPI<TProvider>;\n}\n\n\n\n","/**\n * Simplified Request Handler for Web Framework Integration\n * \n * Handles JSON requests for sandbox and code execution operations.\n * Terminal support removed - will be re-added with WebSocket VM connections.\n */\n\nimport type { Provider, Runtime } from './types';\nimport { compute } from './compute';\n\n/**\n * Request structure supporting sandbox and code execution capabilities\n */\nexport interface ComputeRequest {\n /** Action in dot notation (e.g., 'compute.sandbox.create') */\n action: string;\n \n /** Parameters for the action */\n sandboxId?: string;\n code?: string;\n command?: string;\n args?: string[];\n runtime?: Runtime;\n path?: string;\n content?: string;\n \n /** Command options (for runCommand action) */\n commandOptions?: {\n background?: boolean;\n };\n \n /** Sandbox creation options */\n options?: {\n runtime?: Runtime;\n timeout?: number;\n sandboxId?: string;\n };\n}\n\n/**\n * Response structure for compute operations\n */\nexport interface ComputeResponse {\n success: boolean;\n error?: string;\n sandboxId: string;\n provider: string;\n [key: string]: any; // Allow any additional response data\n}\n\n/**\n * Execute compute action using targeted handling\n */\nasync function executeAction(body: ComputeRequest, provider: Provider): Promise<ComputeResponse> {\n try {\n const { action, sandboxId } = body;\n \n // Sandbox management operations\n if (action === 'compute.sandbox.create') {\n const sandbox = await compute.sandbox.create({\n provider,\n options: body.options || { runtime: 'python' }\n });\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name\n };\n }\n \n if (action === 'compute.sandbox.list') {\n const sandboxes = await compute.sandbox.list(provider);\n return {\n success: true,\n sandboxId: '',\n provider: provider.name,\n sandboxes: sandboxes.map(sb => ({\n sandboxId: sb.sandboxId,\n provider: sb.provider\n }))\n };\n }\n \n if (action === 'compute.sandbox.destroy') {\n if (!sandboxId) {\n throw new Error('sandboxId is required for destroy action');\n }\n await compute.sandbox.destroy(provider, sandboxId);\n return {\n success: true,\n sandboxId,\n provider: provider.name\n };\n }\n \n // For sandbox instance methods, get the sandbox first\n if (!sandboxId) {\n throw new Error('sandboxId is required for this action');\n }\n \n const sandbox = await compute.sandbox.getById(provider, sandboxId);\n if (!sandbox) {\n throw new Error(`Sandbox ${sandboxId} not found`);\n }\n \n // Sandbox info\n if (action === 'compute.sandbox.getInfo') {\n const result = await sandbox.getInfo();\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n info: {\n id: result.id,\n provider: result.provider,\n runtime: result.runtime,\n status: result.status,\n createdAt: result.createdAt.toISOString(),\n timeout: result.timeout,\n metadata: result.metadata\n }\n };\n }\n \n // Code execution\n if (action === 'compute.sandbox.runCode') {\n if (!body.code) throw new Error('code is required');\n const result = await sandbox.runCode(body.code, body.runtime);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n \n if (action === 'compute.sandbox.runCommand') {\n if (!body.command) throw new Error('command is required');\n const result = await sandbox.runCommand(body.command, body.args, body.commandOptions);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime,\n ...(result.isBackground && { isBackground: result.isBackground }),\n ...(result.pid && { pid: result.pid })\n }\n };\n }\n \n // Filesystem operations\n if (action === 'compute.sandbox.filesystem.readFile') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readFile(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n fileContent: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.writeFile') {\n if (!body.path) throw new Error('path is required');\n if (body.content === undefined) throw new Error('content is required');\n await sandbox.filesystem.writeFile(body.path, body.content);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.mkdir') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.mkdir(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.readdir') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readdir(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n files: result.map((entry: any) => ({\n name: entry.name,\n path: entry.path,\n isDirectory: entry.isDirectory,\n size: entry.size,\n lastModified: entry.lastModified.toISOString()\n }))\n };\n }\n \n if (action === 'compute.sandbox.filesystem.exists') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.exists(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n exists: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.remove') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.remove(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n throw new Error(`Unknown action: ${action}`);\n \n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n sandboxId: body.sandboxId || '',\n provider: provider.name\n };\n }\n}\n\n/**\n * Main request handler - handles HTTP requests and pre-parsed bodies\n */\nexport async function handleComputeRequest(\n params: HandleComputeRequestParams\n): Promise<ComputeResponse>;\nexport async function handleComputeRequest(\n requestOrBody: Request | ComputeRequest,\n provider: Provider\n): Promise<Response>;\nexport async function handleComputeRequest(\n paramsOrRequestOrBody: HandleComputeRequestParams | Request | ComputeRequest,\n provider?: Provider\n): Promise<ComputeResponse | Response> {\n // Handle object-style API\n if (typeof paramsOrRequestOrBody === 'object' && 'request' in paramsOrRequestOrBody && 'provider' in paramsOrRequestOrBody) {\n const params = paramsOrRequestOrBody as HandleComputeRequestParams;\n return await executeAction(params.request, params.provider);\n }\n \n // Handle original API\n if (!provider) {\n throw new Error('Provider is required when not using object-style API');\n }\n \n const requestOrBody = paramsOrRequestOrBody as Request | ComputeRequest;\n try {\n let body: ComputeRequest;\n \n if (requestOrBody instanceof Request) {\n // Handle HTTP method validation\n if (requestOrBody.method !== 'POST') {\n return Response.json({\n success: false,\n error: 'Only POST requests are supported',\n sandboxId: '',\n provider: provider.name\n }, { status: 405 });\n }\n \n // Parse JSON body with better error handling\n try {\n body = await requestOrBody.json();\n } catch (parseError) {\n return Response.json({\n success: false,\n error: 'Invalid JSON in request body',\n sandboxId: '',\n provider: provider.name\n }, { status: 400 });\n }\n } else {\n body = requestOrBody;\n }\n \n // Execute the action\n const result = await executeAction(body, provider);\n \n return Response.json(result, {\n status: result.success ? 200 : 500\n });\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Request handling failed',\n sandboxId: '',\n provider: provider.name\n }, { status: 500 });\n }\n}\n\n/**\n * Legacy export for backward compatibility\n */\nexport interface HandleComputeRequestParams {\n request: ComputeRequest;\n provider: Provider;\n}\n\nexport { handleComputeRequest as handleHttpComputeRequest };","/**\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\nimport type {\n Provider,\n ProviderSandboxManager,\n Sandbox,\n SandboxFileSystem,\n SandboxInfo,\n ExecutionResult,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from './types/index.js';\n\n/**\n * Helper function to handle background command execution\n * Providers can use this to implement background job support\n */\nexport function createBackgroundCommand(command: string, args: string[] = [], options?: RunCommandOptions): { command: string; args: string[]; isBackground: boolean } {\n if (!options?.background) {\n return { command, args, isBackground: false };\n }\n\n // For background execution, we modify the command to run in background\n // Default approach: append & to make it run in background\n const fullCommand = args.length > 0 ? `${command} ${args.join(' ')}` : command;\n \n return {\n command: 'sh',\n args: ['-c', `${fullCommand} &`],\n isBackground: true\n };\n}\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 // Instance operations (map to individual Sandbox methods)\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;\n runCommand: (sandbox: TSandbox, command: string, args?: string[], options?: RunCommandOptions) => Promise<ExecutionResult>;\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, args?: string[]) => Promise<ExecutionResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n };\n \n\n}\n\n/**\n * Provider configuration for createProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n };\n}\n\n/**\n * Default filesystem implementations based on shell commands\n * These work for any provider that supports shell command execution\n */\nconst defaultFilesystemMethods = {\n readFile: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<string> => {\n const result = await runCommand(sandbox, 'cat', [path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n }\n // Trim trailing newline that cat command adds\n return result.stdout.replace(/\\n$/, '');\n },\n\n writeFile: async (sandbox: any, path: string, content: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'sh', ['-c', `echo ${JSON.stringify(content)} > ${JSON.stringify(path)}`]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'mkdir', ['-p', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<FileEntry[]> => {\n // Try different ls variations for maximum compatibility\n let result = await runCommand(sandbox, 'ls', ['-la', path]);\n let hasDetailedOutput = true;\n \n // Fall back to basic ls if detailed flags not supported\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', ['-l', path]);\n }\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', [path]);\n hasDetailedOutput = false;\n }\n \n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n\n const lines = (result.stdout || '').split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n if (hasDetailedOutput && line.includes(' ')) {\n // Parse detailed ls output (ls -la or ls -l)\n const parts = line.trim().split(/\\s+/);\n const name = parts[parts.length - 1];\n const isDirectory = line.startsWith('d');\n \n return {\n name,\n path: `${path}/${name}`,\n isDirectory,\n size: parseInt(parts[4]) || 0,\n lastModified: new Date()\n };\n } else {\n // Parse simple ls output (just filenames)\n const name = line.trim();\n return {\n name,\n path: `${path}/${name}`,\n isDirectory: false, // Can't determine from simple ls\n size: 0,\n lastModified: new Date()\n };\n }\n });\n },\n\n exists: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<boolean> => {\n const result = await runCommand(sandbox, 'test', ['-e', path]);\n return result.exitCode === 0; // Exit code 0 means file exists\n },\n\n remove: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'rm', ['-rf', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\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 Sandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements Sandbox {\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 getInstance<T extends TSandbox>(): T;\n getInstance<T extends TSandbox = TSandbox>(): T {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox) as T;\n }\n // Fallback to generic casting\n return this.sandbox as T;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<ExecutionResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult> {\n return await this.methods.runCommand(this.sandbox, command, args, 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 {\n return this.providerInstance;\n }\n\n async kill(): Promise<void> {\n // For backward compatibility, kill() delegates to destroy()\n await this.destroy();\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 {\n private activeSandboxes: Map<string, GeneratedSandbox<TSandbox>> = new Map();\n\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<Sandbox> {\n const result = await this.methods.create(this.config, options);\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async getById(sandboxId: string): Promise<Sandbox | null> {\n // Check active sandboxes first\n const existing = this.activeSandboxes.get(sandboxId);\n if (existing) {\n return existing;\n }\n\n // Try to reconnect\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async list(): Promise<Sandbox[]> {\n const results = await this.methods.list(this.config);\n const sandboxes: Sandbox[] = [];\n\n for (const result of results) {\n let sandbox = this.activeSandboxes.get(result.sandboxId);\n if (!sandbox) {\n sandbox = new GeneratedSandbox(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n this.activeSandboxes.set(result.sandboxId, sandbox);\n }\n sandboxes.push(sandbox);\n }\n\n return sandboxes;\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n this.activeSandboxes.delete(sandboxId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig> implements Provider {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\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 createProvider<TSandbox, TConfig>(\n providerConfig: ProviderConfig<TSandbox, TConfig>\n): (config: TConfig) => Provider {\n // Auto-inject default filesystem methods if none provided\n if (!providerConfig.methods.sandbox.filesystem) {\n providerConfig.methods.sandbox.filesystem = defaultFilesystemMethods;\n }\n\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}"],"mappings":"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","names":["sandbox"]}
|
package/dist/index.mjs
CHANGED
|
@@ -14,6 +14,7 @@ function isCommandExitError(error) {
|
|
|
14
14
|
var ComputeManager = class {
|
|
15
15
|
constructor() {
|
|
16
16
|
this.config = null;
|
|
17
|
+
this.typedState = { isTyped: false, provider: null };
|
|
17
18
|
this.sandbox = {
|
|
18
19
|
/**
|
|
19
20
|
* Create a sandbox from a provider (or default provider if configured)
|
|
@@ -37,7 +38,11 @@ var ComputeManager = class {
|
|
|
37
38
|
create: async (params) => {
|
|
38
39
|
const provider = params && "provider" in params && params.provider ? params.provider : this.getDefaultProvider();
|
|
39
40
|
const options = params?.options;
|
|
40
|
-
|
|
41
|
+
const sandbox = await provider.sandbox.create(options);
|
|
42
|
+
if (this.typedState.isTyped && (!params || !("provider" in params && params.provider))) {
|
|
43
|
+
return sandbox;
|
|
44
|
+
}
|
|
45
|
+
return sandbox;
|
|
41
46
|
},
|
|
42
47
|
/**
|
|
43
48
|
* Get an existing sandbox by ID from a provider (or default provider if configured)
|
|
@@ -45,7 +50,11 @@ var ComputeManager = class {
|
|
|
45
50
|
getById: async (providerOrSandboxId, sandboxId) => {
|
|
46
51
|
if (typeof providerOrSandboxId === "string") {
|
|
47
52
|
const provider = this.getDefaultProvider();
|
|
48
|
-
|
|
53
|
+
const sandbox = await provider.sandbox.getById(providerOrSandboxId);
|
|
54
|
+
if (this.typedState.isTyped && sandbox) {
|
|
55
|
+
return sandbox;
|
|
56
|
+
}
|
|
57
|
+
return sandbox;
|
|
49
58
|
} else {
|
|
50
59
|
if (!sandboxId) {
|
|
51
60
|
throw new Error("sandboxId is required when provider is specified");
|
|
@@ -58,7 +67,11 @@ var ComputeManager = class {
|
|
|
58
67
|
*/
|
|
59
68
|
list: async (provider) => {
|
|
60
69
|
const actualProvider = provider || this.getDefaultProvider();
|
|
61
|
-
|
|
70
|
+
const sandboxes = await actualProvider.sandbox.list();
|
|
71
|
+
if (this.typedState.isTyped && !provider) {
|
|
72
|
+
return sandboxes;
|
|
73
|
+
}
|
|
74
|
+
return sandboxes;
|
|
62
75
|
},
|
|
63
76
|
/**
|
|
64
77
|
* Destroy a sandbox via a provider (or default provider if configured)
|
|
@@ -77,7 +90,7 @@ var ComputeManager = class {
|
|
|
77
90
|
};
|
|
78
91
|
}
|
|
79
92
|
/**
|
|
80
|
-
* Set default configuration
|
|
93
|
+
* Set default configuration with generic type preservation
|
|
81
94
|
*/
|
|
82
95
|
setConfig(config) {
|
|
83
96
|
if (!config.defaultProvider && !config.provider) {
|
|
@@ -91,6 +104,10 @@ var ComputeManager = class {
|
|
|
91
104
|
provider: actualProvider,
|
|
92
105
|
defaultProvider: actualProvider
|
|
93
106
|
};
|
|
107
|
+
this.typedState = {
|
|
108
|
+
isTyped: true,
|
|
109
|
+
provider: actualProvider
|
|
110
|
+
};
|
|
94
111
|
}
|
|
95
112
|
/**
|
|
96
113
|
* Get current configuration
|
|
@@ -108,12 +125,13 @@ var ComputeManager = class {
|
|
|
108
125
|
* Get the default provider, throwing if not configured
|
|
109
126
|
*/
|
|
110
127
|
getDefaultProvider() {
|
|
111
|
-
|
|
128
|
+
const provider = this.config?.defaultProvider || this.config?.provider;
|
|
129
|
+
if (!provider) {
|
|
112
130
|
throw new Error(
|
|
113
131
|
"No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly."
|
|
114
132
|
);
|
|
115
133
|
}
|
|
116
|
-
return
|
|
134
|
+
return provider;
|
|
117
135
|
}
|
|
118
136
|
// Future: compute.blob.*, compute.database.*, compute.git.* will be added here
|
|
119
137
|
// blob = new BlobManager();
|
|
@@ -121,6 +139,40 @@ var ComputeManager = class {
|
|
|
121
139
|
// git = new GitManager();
|
|
122
140
|
};
|
|
123
141
|
var compute = new ComputeManager();
|
|
142
|
+
function createCompute(config) {
|
|
143
|
+
const manager = new ComputeManager();
|
|
144
|
+
const actualProvider = config.defaultProvider || config.provider;
|
|
145
|
+
manager["config"] = {
|
|
146
|
+
provider: actualProvider,
|
|
147
|
+
defaultProvider: actualProvider
|
|
148
|
+
};
|
|
149
|
+
manager["typedState"] = {
|
|
150
|
+
isTyped: true,
|
|
151
|
+
provider: actualProvider
|
|
152
|
+
};
|
|
153
|
+
return {
|
|
154
|
+
setConfig: (cfg) => createCompute(cfg),
|
|
155
|
+
getConfig: () => manager.getConfig(),
|
|
156
|
+
clearConfig: () => manager.clearConfig(),
|
|
157
|
+
sandbox: {
|
|
158
|
+
create: async (params) => {
|
|
159
|
+
const sandbox = await manager.sandbox.create(params);
|
|
160
|
+
return sandbox;
|
|
161
|
+
},
|
|
162
|
+
getById: async (sandboxId) => {
|
|
163
|
+
const sandbox = await manager.sandbox.getById(sandboxId);
|
|
164
|
+
return sandbox ? sandbox : null;
|
|
165
|
+
},
|
|
166
|
+
list: async () => {
|
|
167
|
+
const sandboxes = await manager.sandbox.list();
|
|
168
|
+
return sandboxes;
|
|
169
|
+
},
|
|
170
|
+
destroy: async (sandboxId) => {
|
|
171
|
+
return await manager.sandbox.destroy(sandboxId);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
124
176
|
|
|
125
177
|
// src/request-handler.ts
|
|
126
178
|
async function executeAction(body, provider) {
|
|
@@ -201,7 +253,7 @@ async function executeAction(body, provider) {
|
|
|
201
253
|
}
|
|
202
254
|
if (action === "compute.sandbox.runCommand") {
|
|
203
255
|
if (!body.command) throw new Error("command is required");
|
|
204
|
-
const result = await sandbox.runCommand(body.command, body.args);
|
|
256
|
+
const result = await sandbox.runCommand(body.command, body.args, body.commandOptions);
|
|
205
257
|
return {
|
|
206
258
|
success: true,
|
|
207
259
|
sandboxId,
|
|
@@ -210,7 +262,9 @@ async function executeAction(body, provider) {
|
|
|
210
262
|
stdout: result.stdout,
|
|
211
263
|
stderr: result.stderr,
|
|
212
264
|
exitCode: result.exitCode,
|
|
213
|
-
executionTime: result.executionTime
|
|
265
|
+
executionTime: result.executionTime,
|
|
266
|
+
...result.isBackground && { isBackground: result.isBackground },
|
|
267
|
+
...result.pid && { pid: result.pid }
|
|
214
268
|
}
|
|
215
269
|
};
|
|
216
270
|
}
|
|
@@ -324,6 +378,17 @@ async function handleComputeRequest(paramsOrRequestOrBody, provider) {
|
|
|
324
378
|
}
|
|
325
379
|
|
|
326
380
|
// src/factory.ts
|
|
381
|
+
function createBackgroundCommand(command, args = [], options) {
|
|
382
|
+
if (!options?.background) {
|
|
383
|
+
return { command, args, isBackground: false };
|
|
384
|
+
}
|
|
385
|
+
const fullCommand = args.length > 0 ? `${command} ${args.join(" ")}` : command;
|
|
386
|
+
return {
|
|
387
|
+
command: "sh",
|
|
388
|
+
args: ["-c", `${fullCommand} &`],
|
|
389
|
+
isBackground: true
|
|
390
|
+
};
|
|
391
|
+
}
|
|
327
392
|
var defaultFilesystemMethods = {
|
|
328
393
|
readFile: async (sandbox, path, runCommand) => {
|
|
329
394
|
const result = await runCommand(sandbox, "cat", [path]);
|
|
@@ -466,8 +531,8 @@ var GeneratedSandbox = class {
|
|
|
466
531
|
async runCode(code, runtime) {
|
|
467
532
|
return await this.methods.runCode(this.sandbox, code, runtime, this.config);
|
|
468
533
|
}
|
|
469
|
-
async runCommand(command, args) {
|
|
470
|
-
return await this.methods.runCommand(this.sandbox, command, args);
|
|
534
|
+
async runCommand(command, args, options) {
|
|
535
|
+
return await this.methods.runCommand(this.sandbox, command, args, options);
|
|
471
536
|
}
|
|
472
537
|
async getInfo() {
|
|
473
538
|
return await this.methods.getInfo(this.sandbox);
|
|
@@ -576,6 +641,8 @@ function createProvider(providerConfig) {
|
|
|
576
641
|
export {
|
|
577
642
|
CommandExitError,
|
|
578
643
|
compute,
|
|
644
|
+
createBackgroundCommand,
|
|
645
|
+
createCompute,
|
|
579
646
|
createProvider,
|
|
580
647
|
handleComputeRequest,
|
|
581
648
|
isCommandExitError
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/sandbox.ts","../src/compute.ts","../src/request-handler.ts","../src/factory.ts"],"sourcesContent":["/**\n * Sandbox Types\n * \n * Types related to sandbox execution, filesystem, terminal operations\n */\n\n// Forward declaration to avoid circular dependency\ninterface Provider {\n readonly name: string;\n readonly sandbox: any; // Will be properly typed when imported together\n}\n\n/**\n * Supported runtime environments\n */\nexport type Runtime = 'node' | 'python';\n\n/**\n * Sandbox status types\n */\nexport type SandboxStatus = 'running' | 'stopped' | 'error';\n\n/**\n * Result of code execution\n */\nexport interface ExecutionResult {\n /** Standard output from the execution */\n stdout: string;\n /** Standard error from the execution */\n stderr: string;\n /** Exit code from the execution */\n exitCode: number;\n /** Time taken for execution in milliseconds */\n executionTime: number;\n /** ID of the sandbox where the code was executed */\n sandboxId: string;\n /** Provider that executed the code */\n provider: string;\n}\n\n/**\n * Information about a sandbox\n */\nexport interface SandboxInfo {\n /** Unique identifier for the sandbox */\n id: string;\n /** Provider hosting the sandbox */\n provider: string;\n /** Runtime environment in the sandbox */\n runtime: Runtime;\n /** Current status of the sandbox */\n status: SandboxStatus;\n /** When the sandbox was created */\n createdAt: Date;\n /** Execution timeout in milliseconds */\n timeout: number;\n /** Additional provider-specific metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Options for creating a sandbox\n */\nexport interface CreateSandboxOptions {\n /** Runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Custom sandbox ID (if supported by provider) */\n sandboxId?: string;\n /** Template ID for sandbox creation (provider-specific) */\n templateId?: string;\n /** Additional metadata for the sandbox */\n metadata?: Record<string, any>;\n /** Domain for sandbox connection (provider-specific) */\n domain?: string;\n /** Environment variables for the sandbox */\n envs?: Record<string, string>;\n}\n\n/**\n * File system entry information\n */\nexport interface FileEntry {\n /** File/directory name */\n name: string;\n /** Full path to the entry */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** File size in bytes (0 for directories) */\n size: number;\n /** Last modified timestamp */\n lastModified: Date;\n}\n\n/**\n * File system interface for sandbox operations\n */\nexport interface SandboxFileSystem {\n /** Read file contents */\n readFile(path: string): Promise<string>;\n /** Write file contents */\n writeFile(path: string, content: string): Promise<void>;\n /** Create directory */\n mkdir(path: string): Promise<void>;\n /** List directory contents */\n readdir(path: string): Promise<FileEntry[]>;\n /** Check if file/directory exists */\n exists(path: string): Promise<boolean>;\n /** Remove file or directory */\n remove(path: string): Promise<void>;\n}\n\n/**\n * Error thrown when a command exits with a non-zero status\n */\nexport class CommandExitError extends Error {\n name = 'CommandExitError';\n constructor(public result: {\n exitCode: number;\n stdout: string;\n stderr: string;\n error: boolean;\n }) {\n super(`Command exited with code ${result.exitCode}`);\n }\n}\n\n/**\n * Type guard to check if an error is a CommandExitError\n */\nexport function isCommandExitError(error: unknown): error is CommandExitError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'CommandExitError' &&\n 'result' in error\n );\n}\n\n\n\n\n\n/**\n * Base sandbox interface - what developers interact with\n */\nexport interface Sandbox {\n /** Unique identifier for the sandbox */\n readonly sandboxId: string;\n /** Provider that created this sandbox */\n readonly provider: string;\n\n /** Execute code in the sandbox */\n runCode(code: string, runtime?: Runtime): Promise<ExecutionResult>;\n /** Execute shell commands */\n runCommand(command: string, args?: string[]): Promise<ExecutionResult>;\n /** Get information about the sandbox */\n getInfo(): Promise<SandboxInfo>;\n /** Get URL for accessing the sandbox on a specific port */\n getUrl(options: { port: number; protocol?: string }): Promise<string>;\n /** Get the provider instance that created this sandbox */\n getProvider(): Provider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance<T = any>(): T;\n /** Kill the sandbox */\n kill(): Promise<void>;\n /** Destroy the sandbox and clean up resources */\n destroy(): Promise<void>;\n\n /** File system operations */\n readonly filesystem: SandboxFileSystem;\n}","/**\n * Compute Singleton - Main API Orchestrator\n * \n * Provides the unified compute.* API and delegates to specialized managers\n */\n\nimport type { ComputeAPI, CreateSandboxParams, CreateSandboxParamsWithOptionalProvider, ComputeConfig, Sandbox, Provider } from './types';\n\n/**\n * Compute singleton implementation - orchestrates all compute operations\n */\nclass ComputeManager implements ComputeAPI {\n private config: ComputeConfig | null = null;\n\n /**\n * Set default configuration\n */\n setConfig(config: ComputeConfig): void {\n // Validate that at least one provider is specified\n if (!config.defaultProvider && !config.provider) {\n throw new Error('Either defaultProvider or provider must be specified in setConfig');\n }\n \n // Handle backwards compatibility: if both are provided, defaultProvider takes precedence\n if (config.defaultProvider && config.provider) {\n console.warn('Both defaultProvider and provider specified in setConfig. Using defaultProvider. The provider key is deprecated, please use defaultProvider instead.');\n }\n \n // Normalize config to always have provider for internal use (for backwards compatibility)\n const actualProvider = config.defaultProvider || config.provider!;\n this.config = {\n provider: actualProvider,\n defaultProvider: actualProvider\n };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ComputeConfig | null {\n return this.config;\n }\n\n /**\n * Clear current configuration\n */\n clearConfig(): void {\n this.config = null;\n }\n\n /**\n * Get the default provider, throwing if not configured\n */\n private getDefaultProvider(): Provider {\n if (!this.config?.provider) {\n throw new Error(\n 'No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly.'\n );\n }\n return this.config.provider;\n }\n\n sandbox = {\n /**\n * Create a sandbox from a provider (or default provider if configured)\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { compute } from 'computesdk'\n * \n * // With explicit provider\n * const sandbox = await compute.sandbox.create({\n * provider: e2b({ apiKey: 'your-key' })\n * })\n * \n * // With default provider (both forms work)\n * compute.setConfig({ defaultProvider: e2b({ apiKey: 'your-key' }) })\n * const sandbox1 = await compute.sandbox.create({})\n * const sandbox2 = await compute.sandbox.create()\n * ```\n */\n create: async (params?: CreateSandboxParams | CreateSandboxParamsWithOptionalProvider): Promise<Sandbox> => {\n const provider = params && 'provider' in params && params.provider ? params.provider : this.getDefaultProvider();\n const options = params?.options;\n return await provider.sandbox.create(options);\n },\n\n /**\n * Get an existing sandbox by ID from a provider (or default provider if configured)\n */\n getById: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<Sandbox | null> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.getById(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.getById(sandboxId);\n }\n },\n\n /**\n * List all active sandboxes from a provider (or default provider if configured)\n */\n list: async (provider?: Provider): Promise<Sandbox[]> => {\n const actualProvider = provider || this.getDefaultProvider();\n return await actualProvider.sandbox.list();\n },\n\n /**\n * Destroy a sandbox via a provider (or default provider if configured)\n */\n destroy: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.destroy(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.destroy(sandboxId);\n }\n }\n };\n\n // Future: compute.blob.*, compute.database.*, compute.git.* will be added here\n // blob = new BlobManager();\n // database = new DatabaseManager(); \n // git = new GitManager();\n\n\n}\n\n/**\n * Singleton instance - the main API\n */\nexport const compute: ComputeAPI = new ComputeManager();\n\n","/**\n * Simplified Request Handler for Web Framework Integration\n * \n * Handles JSON requests for sandbox and code execution operations.\n * Terminal support removed - will be re-added with WebSocket VM connections.\n */\n\nimport type { Provider, Runtime } from './types';\nimport { compute } from './compute';\n\n/**\n * Request structure supporting sandbox and code execution capabilities\n */\nexport interface ComputeRequest {\n /** Action in dot notation (e.g., 'compute.sandbox.create') */\n action: string;\n \n /** Parameters for the action */\n sandboxId?: string;\n code?: string;\n command?: string;\n args?: string[];\n runtime?: Runtime;\n path?: string;\n content?: string;\n \n /** Sandbox creation options */\n options?: {\n runtime?: Runtime;\n timeout?: number;\n sandboxId?: string;\n };\n}\n\n/**\n * Response structure for compute operations\n */\nexport interface ComputeResponse {\n success: boolean;\n error?: string;\n sandboxId: string;\n provider: string;\n [key: string]: any; // Allow any additional response data\n}\n\n/**\n * Execute compute action using targeted handling\n */\nasync function executeAction(body: ComputeRequest, provider: Provider): Promise<ComputeResponse> {\n try {\n const { action, sandboxId } = body;\n \n // Sandbox management operations\n if (action === 'compute.sandbox.create') {\n const sandbox = await compute.sandbox.create({\n provider,\n options: body.options || { runtime: 'python' }\n });\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name\n };\n }\n \n if (action === 'compute.sandbox.list') {\n const sandboxes = await compute.sandbox.list(provider);\n return {\n success: true,\n sandboxId: '',\n provider: provider.name,\n sandboxes: sandboxes.map(sb => ({\n sandboxId: sb.sandboxId,\n provider: sb.provider\n }))\n };\n }\n \n if (action === 'compute.sandbox.destroy') {\n if (!sandboxId) {\n throw new Error('sandboxId is required for destroy action');\n }\n await compute.sandbox.destroy(provider, sandboxId);\n return {\n success: true,\n sandboxId,\n provider: provider.name\n };\n }\n \n // For sandbox instance methods, get the sandbox first\n if (!sandboxId) {\n throw new Error('sandboxId is required for this action');\n }\n \n const sandbox = await compute.sandbox.getById(provider, sandboxId);\n if (!sandbox) {\n throw new Error(`Sandbox ${sandboxId} not found`);\n }\n \n // Sandbox info\n if (action === 'compute.sandbox.getInfo') {\n const result = await sandbox.getInfo();\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n info: {\n id: result.id,\n provider: result.provider,\n runtime: result.runtime,\n status: result.status,\n createdAt: result.createdAt.toISOString(),\n timeout: result.timeout,\n metadata: result.metadata\n }\n };\n }\n \n // Code execution\n if (action === 'compute.sandbox.runCode') {\n if (!body.code) throw new Error('code is required');\n const result = await sandbox.runCode(body.code, body.runtime);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n \n if (action === 'compute.sandbox.runCommand') {\n if (!body.command) throw new Error('command is required');\n const result = await sandbox.runCommand(body.command, body.args);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n \n // Filesystem operations\n if (action === 'compute.sandbox.filesystem.readFile') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readFile(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n fileContent: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.writeFile') {\n if (!body.path) throw new Error('path is required');\n if (body.content === undefined) throw new Error('content is required');\n await sandbox.filesystem.writeFile(body.path, body.content);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.mkdir') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.mkdir(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.readdir') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readdir(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n files: result.map((entry: any) => ({\n name: entry.name,\n path: entry.path,\n isDirectory: entry.isDirectory,\n size: entry.size,\n lastModified: entry.lastModified.toISOString()\n }))\n };\n }\n \n if (action === 'compute.sandbox.filesystem.exists') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.exists(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n exists: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.remove') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.remove(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n throw new Error(`Unknown action: ${action}`);\n \n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n sandboxId: body.sandboxId || '',\n provider: provider.name\n };\n }\n}\n\n/**\n * Main request handler - handles HTTP requests and pre-parsed bodies\n */\nexport async function handleComputeRequest(\n params: HandleComputeRequestParams\n): Promise<ComputeResponse>;\nexport async function handleComputeRequest(\n requestOrBody: Request | ComputeRequest,\n provider: Provider\n): Promise<Response>;\nexport async function handleComputeRequest(\n paramsOrRequestOrBody: HandleComputeRequestParams | Request | ComputeRequest,\n provider?: Provider\n): Promise<ComputeResponse | Response> {\n // Handle object-style API\n if (typeof paramsOrRequestOrBody === 'object' && 'request' in paramsOrRequestOrBody && 'provider' in paramsOrRequestOrBody) {\n const params = paramsOrRequestOrBody as HandleComputeRequestParams;\n return await executeAction(params.request, params.provider);\n }\n \n // Handle original API\n if (!provider) {\n throw new Error('Provider is required when not using object-style API');\n }\n \n const requestOrBody = paramsOrRequestOrBody as Request | ComputeRequest;\n try {\n let body: ComputeRequest;\n \n if (requestOrBody instanceof Request) {\n // Handle HTTP method validation\n if (requestOrBody.method !== 'POST') {\n return Response.json({\n success: false,\n error: 'Only POST requests are supported',\n sandboxId: '',\n provider: provider.name\n }, { status: 405 });\n }\n \n // Parse JSON body with better error handling\n try {\n body = await requestOrBody.json();\n } catch (parseError) {\n return Response.json({\n success: false,\n error: 'Invalid JSON in request body',\n sandboxId: '',\n provider: provider.name\n }, { status: 400 });\n }\n } else {\n body = requestOrBody;\n }\n \n // Execute the action\n const result = await executeAction(body, provider);\n \n return Response.json(result, {\n status: result.success ? 200 : 500\n });\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Request handling failed',\n sandboxId: '',\n provider: provider.name\n }, { status: 500 });\n }\n}\n\n/**\n * Legacy export for backward compatibility\n */\nexport interface HandleComputeRequestParams {\n request: ComputeRequest;\n provider: Provider;\n}\n\nexport { handleComputeRequest as handleHttpComputeRequest };","/**\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\nimport type {\n Provider,\n ProviderSandboxManager,\n Sandbox,\n SandboxFileSystem,\n SandboxInfo,\n ExecutionResult,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\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 // Instance operations (map to individual Sandbox methods)\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;\n runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>;\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, args?: string[]) => Promise<ExecutionResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n };\n \n\n}\n\n/**\n * Provider configuration for createProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n };\n}\n\n/**\n * Default filesystem implementations based on shell commands\n * These work for any provider that supports shell command execution\n */\nconst defaultFilesystemMethods = {\n readFile: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<string> => {\n const result = await runCommand(sandbox, 'cat', [path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n }\n // Trim trailing newline that cat command adds\n return result.stdout.replace(/\\n$/, '');\n },\n\n writeFile: async (sandbox: any, path: string, content: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'sh', ['-c', `echo ${JSON.stringify(content)} > ${JSON.stringify(path)}`]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'mkdir', ['-p', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<FileEntry[]> => {\n // Try different ls variations for maximum compatibility\n let result = await runCommand(sandbox, 'ls', ['-la', path]);\n let hasDetailedOutput = true;\n \n // Fall back to basic ls if detailed flags not supported\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', ['-l', path]);\n }\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', [path]);\n hasDetailedOutput = false;\n }\n \n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n\n const lines = (result.stdout || '').split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n if (hasDetailedOutput && line.includes(' ')) {\n // Parse detailed ls output (ls -la or ls -l)\n const parts = line.trim().split(/\\s+/);\n const name = parts[parts.length - 1];\n const isDirectory = line.startsWith('d');\n \n return {\n name,\n path: `${path}/${name}`,\n isDirectory,\n size: parseInt(parts[4]) || 0,\n lastModified: new Date()\n };\n } else {\n // Parse simple ls output (just filenames)\n const name = line.trim();\n return {\n name,\n path: `${path}/${name}`,\n isDirectory: false, // Can't determine from simple ls\n size: 0,\n lastModified: new Date()\n };\n }\n });\n },\n\n exists: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<boolean> => {\n const result = await runCommand(sandbox, 'test', ['-e', path]);\n return result.exitCode === 0; // Exit code 0 means file exists\n },\n\n remove: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'rm', ['-rf', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\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 Sandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements Sandbox {\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 getInstance<T extends TSandbox>(): T;\n getInstance<T extends TSandbox = TSandbox>(): T {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox) as T;\n }\n // Fallback to generic casting\n return this.sandbox as T;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<ExecutionResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(command: string, args?: string[]): Promise<ExecutionResult> {\n return await this.methods.runCommand(this.sandbox, command, args);\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 {\n return this.providerInstance;\n }\n\n async kill(): Promise<void> {\n // For backward compatibility, kill() delegates to destroy()\n await this.destroy();\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 {\n private activeSandboxes: Map<string, GeneratedSandbox<TSandbox>> = new Map();\n\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<Sandbox> {\n const result = await this.methods.create(this.config, options);\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async getById(sandboxId: string): Promise<Sandbox | null> {\n // Check active sandboxes first\n const existing = this.activeSandboxes.get(sandboxId);\n if (existing) {\n return existing;\n }\n\n // Try to reconnect\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async list(): Promise<Sandbox[]> {\n const results = await this.methods.list(this.config);\n const sandboxes: Sandbox[] = [];\n\n for (const result of results) {\n let sandbox = this.activeSandboxes.get(result.sandboxId);\n if (!sandbox) {\n sandbox = new GeneratedSandbox(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n this.activeSandboxes.set(result.sandboxId, sandbox);\n }\n sandboxes.push(sandbox);\n }\n\n return sandboxes;\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n this.activeSandboxes.delete(sandboxId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig> implements Provider {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\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 createProvider<TSandbox, TConfig>(\n providerConfig: ProviderConfig<TSandbox, TConfig>\n): (config: TConfig) => Provider {\n // Auto-inject default filesystem methods if none provided\n if (!providerConfig.methods.sandbox.filesystem) {\n providerConfig.methods.sandbox.filesystem = defaultFilesystemMethods;\n }\n\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}"],"mappings":"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","names":["sandbox"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/sandbox.ts","../src/compute.ts","../src/request-handler.ts","../src/factory.ts"],"sourcesContent":["/**\n * Sandbox Types\n * \n * Types related to sandbox execution, filesystem, terminal operations\n */\n\n// Forward declaration to avoid circular dependency\ninterface Provider {\n readonly name: string;\n readonly sandbox: any; // Will be properly typed when imported together\n}\n\n/**\n * Utility type to extract the native instance type from a provider\n * This enables proper typing for getInstance() calls by looking at the provider's internal types\n */\nexport type ExtractSandboxInstanceType<TProvider extends Provider> = TProvider extends Provider ? \n TProvider extends { \n sandbox: { \n create(): Promise<infer TSandbox> \n } \n } ? (\n TSandbox extends { getInstance(): infer TInstance } \n ? TInstance \n : any\n ) : any : any;\n\n/**\n * Supported runtime environments\n */\nexport type Runtime = 'node' | 'python';\n\n/**\n * Sandbox status types\n */\nexport type SandboxStatus = 'running' | 'stopped' | 'error';\n\n/**\n * Options for running commands\n */\nexport interface RunCommandOptions {\n /** Run command in background (non-blocking) */\n background?: boolean;\n}\n\n/**\n * Result of code execution\n */\nexport interface ExecutionResult {\n /** Standard output from the execution */\n stdout: string;\n /** Standard error from the execution */\n stderr: string;\n /** Exit code from the execution */\n exitCode: number;\n /** Time taken for execution in milliseconds */\n executionTime: number;\n /** ID of the sandbox where the code was executed */\n sandboxId: string;\n /** Provider that executed the code */\n provider: string;\n /** Process ID for background jobs (if applicable) */\n pid?: number;\n /** Whether this command is running in background */\n isBackground?: boolean;\n}\n\n/**\n * Information about a sandbox\n */\nexport interface SandboxInfo {\n /** Unique identifier for the sandbox */\n id: string;\n /** Provider hosting the sandbox */\n provider: string;\n /** Runtime environment in the sandbox */\n runtime: Runtime;\n /** Current status of the sandbox */\n status: SandboxStatus;\n /** When the sandbox was created */\n createdAt: Date;\n /** Execution timeout in milliseconds */\n timeout: number;\n /** Additional provider-specific metadata */\n metadata?: Record<string, any>;\n}\n\n/**\n * Options for creating a sandbox\n */\nexport interface CreateSandboxOptions {\n /** Runtime environment */\n runtime?: Runtime;\n /** Execution timeout in milliseconds */\n timeout?: number;\n /** Custom sandbox ID (if supported by provider) */\n sandboxId?: string;\n /** Template ID for sandbox creation (provider-specific) */\n templateId?: string;\n /** Additional metadata for the sandbox */\n metadata?: Record<string, any>;\n /** Domain for sandbox connection (provider-specific) */\n domain?: string;\n /** Environment variables for the sandbox */\n envs?: Record<string, string>;\n}\n\n/**\n * File system entry information\n */\nexport interface FileEntry {\n /** File/directory name */\n name: string;\n /** Full path to the entry */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** File size in bytes (0 for directories) */\n size: number;\n /** Last modified timestamp */\n lastModified: Date;\n}\n\n/**\n * File system interface for sandbox operations\n */\nexport interface SandboxFileSystem {\n /** Read file contents */\n readFile(path: string): Promise<string>;\n /** Write file contents */\n writeFile(path: string, content: string): Promise<void>;\n /** Create directory */\n mkdir(path: string): Promise<void>;\n /** List directory contents */\n readdir(path: string): Promise<FileEntry[]>;\n /** Check if file/directory exists */\n exists(path: string): Promise<boolean>;\n /** Remove file or directory */\n remove(path: string): Promise<void>;\n}\n\n/**\n * Error thrown when a command exits with a non-zero status\n */\nexport class CommandExitError extends Error {\n name = 'CommandExitError';\n constructor(public result: {\n exitCode: number;\n stdout: string;\n stderr: string;\n error: boolean;\n }) {\n super(`Command exited with code ${result.exitCode}`);\n }\n}\n\n/**\n * Type guard to check if an error is a CommandExitError\n */\nexport function isCommandExitError(error: unknown): error is CommandExitError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'CommandExitError' &&\n 'result' in error\n );\n}\n\n\n\n\n\n/**\n * Base sandbox interface - what developers interact with\n */\nexport interface Sandbox {\n /** Unique identifier for the sandbox */\n readonly sandboxId: string;\n /** Provider that created this sandbox */\n readonly provider: string;\n\n /** Execute code in the sandbox */\n runCode(code: string, runtime?: Runtime): Promise<ExecutionResult>;\n /** Execute shell commands */\n runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult>;\n /** Get information about the sandbox */\n getInfo(): Promise<SandboxInfo>;\n /** Get URL for accessing the sandbox on a specific port */\n getUrl(options: { port: number; protocol?: string }): Promise<string>;\n /** Get the provider instance that created this sandbox */\n getProvider(): Provider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance<T = any>(): T;\n /** Kill the sandbox */\n kill(): Promise<void>;\n /** Destroy the sandbox and clean up resources */\n destroy(): Promise<void>;\n\n /** File system operations */\n readonly filesystem: SandboxFileSystem;\n}\n\n/**\n * Typed sandbox interface that preserves the provider's native instance type\n */\nexport interface TypedSandbox<TProvider extends Provider> extends Sandbox {\n /** Get the provider instance that created this sandbox with proper typing */\n getProvider(): TProvider;\n /** Get the native provider sandbox instance with proper typing */\n getInstance(): ExtractSandboxInstanceType<TProvider>;\n getInstance<T>(): T;\n}","/**\n * Compute Singleton - Main API Orchestrator\n * \n * Provides the unified compute.* API and delegates to specialized managers\n */\n\nimport type { ComputeAPI, CreateSandboxParams, CreateSandboxParamsWithOptionalProvider, ComputeConfig, Sandbox, Provider, TypedSandbox, TypedComputeAPI } from './types';\n\n/**\n * Compute singleton implementation - orchestrates all compute operations\n */\nclass ComputeManager implements ComputeAPI {\n private config: ComputeConfig | null = null;\n private typedState: { \n isTyped: boolean; \n provider: Provider | null; \n } = { isTyped: false, provider: null };\n\n /**\n * Set default configuration with generic type preservation\n */\n setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void {\n // Validate that at least one provider is specified\n if (!config.defaultProvider && !config.provider) {\n throw new Error('Either defaultProvider or provider must be specified in setConfig');\n }\n \n // Handle backwards compatibility: if both are provided, defaultProvider takes precedence\n if (config.defaultProvider && config.provider) {\n console.warn('Both defaultProvider and provider specified in setConfig. Using defaultProvider. The provider key is deprecated, please use defaultProvider instead.');\n }\n \n // Normalize config to always have both fields for internal use (backward compatibility)\n const actualProvider = config.defaultProvider || config.provider!;\n this.config = {\n provider: actualProvider,\n defaultProvider: actualProvider\n };\n\n // Store typed state for type-aware operations\n this.typedState = {\n isTyped: true,\n provider: actualProvider\n };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ComputeConfig | null {\n return this.config;\n }\n\n /**\n * Clear current configuration\n */\n clearConfig(): void {\n this.config = null;\n }\n\n /**\n * Get the default provider, throwing if not configured\n */\n private getDefaultProvider(): Provider {\n const provider = this.config?.defaultProvider || this.config?.provider;\n if (!provider) {\n throw new Error(\n 'No default provider configured. Either call compute.setConfig({ defaultProvider }) or pass provider explicitly.'\n );\n }\n return provider;\n }\n\n sandbox = {\n /**\n * Create a sandbox from a provider (or default provider if configured)\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { compute } from 'computesdk'\n * \n * // With explicit provider\n * const sandbox = await compute.sandbox.create({\n * provider: e2b({ apiKey: 'your-key' })\n * })\n * \n * // With default provider (both forms work)\n * compute.setConfig({ defaultProvider: e2b({ apiKey: 'your-key' }) })\n * const sandbox1 = await compute.sandbox.create({})\n * const sandbox2 = await compute.sandbox.create()\n * ```\n */\n create: async (params?: CreateSandboxParams | CreateSandboxParamsWithOptionalProvider): Promise<Sandbox> => {\n const provider = params && 'provider' in params && params.provider ? params.provider : this.getDefaultProvider();\n const options = params?.options;\n const sandbox = await provider.sandbox.create(options);\n \n // If we have typed state and no explicit provider passed, cast to typed sandbox\n // This enables proper type inference for getInstance() when using default provider\n if (this.typedState.isTyped && (!params || !('provider' in params && params.provider))) {\n return sandbox as TypedSandbox<any>;\n }\n \n return sandbox;\n },\n\n /**\n * Get an existing sandbox by ID from a provider (or default provider if configured)\n */\n getById: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<Sandbox | null> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n const sandbox = await provider.sandbox.getById(providerOrSandboxId);\n \n // If we have typed state, cast to typed sandbox for proper getInstance() typing\n if (this.typedState.isTyped && sandbox) {\n return sandbox as TypedSandbox<any>;\n }\n \n return sandbox;\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.getById(sandboxId);\n }\n },\n\n /**\n * List all active sandboxes from a provider (or default provider if configured)\n */\n list: async (provider?: Provider): Promise<Sandbox[]> => {\n const actualProvider = provider || this.getDefaultProvider();\n const sandboxes = await actualProvider.sandbox.list();\n \n // If we have typed state and no explicit provider passed, cast to typed sandboxes\n if (this.typedState.isTyped && !provider) {\n return sandboxes as TypedSandbox<any>[];\n }\n \n return sandboxes;\n },\n\n /**\n * Destroy a sandbox via a provider (or default provider if configured)\n */\n destroy: async (providerOrSandboxId: Provider | string, sandboxId?: string): Promise<void> => {\n if (typeof providerOrSandboxId === 'string') {\n // Called with just sandboxId, use default provider\n const provider = this.getDefaultProvider();\n return await provider.sandbox.destroy(providerOrSandboxId);\n } else {\n // Called with provider and sandboxId\n if (!sandboxId) {\n throw new Error('sandboxId is required when provider is specified');\n }\n return await providerOrSandboxId.sandbox.destroy(sandboxId);\n }\n }\n };\n\n // Future: compute.blob.*, compute.database.*, compute.git.* will be added here\n // blob = new BlobManager();\n // database = new DatabaseManager(); \n // git = new GitManager();\n\n\n}\n\n/**\n * Singleton instance - the main API (untyped)\n */\nexport const compute: ComputeAPI = new ComputeManager();\n\n/**\n * Create a compute instance with proper typing\n * This enables proper type inference for getInstance() calls\n * \n * @example\n * ```typescript\n * import { e2b } from '@computesdk/e2b'\n * import { createCompute } from 'computesdk'\n * \n * const compute = createCompute({\n * defaultProvider: e2b({ apiKey: 'your-key' }),\n * });\n * \n * const sandbox = await compute.sandbox.create();\n * const instance = sandbox.getInstance(); // ✅ Properly typed!\n * ```\n */\nexport function createCompute<TProvider extends Provider>(config: ComputeConfig<TProvider>): TypedComputeAPI<TProvider> {\n const manager = new ComputeManager();\n \n // Set config directly without calling the public setConfig method\n const actualProvider = config.defaultProvider || config.provider!;\n manager['config'] = {\n provider: actualProvider,\n defaultProvider: actualProvider\n };\n manager['typedState'] = {\n isTyped: true,\n provider: actualProvider\n };\n \n return {\n setConfig: <T extends Provider>(cfg: ComputeConfig<T>) => createCompute(cfg),\n getConfig: () => manager.getConfig(),\n clearConfig: () => manager.clearConfig(),\n \n sandbox: {\n create: async (params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>) => {\n const sandbox = await manager.sandbox.create(params);\n return sandbox as TypedSandbox<TProvider>;\n },\n \n getById: async (sandboxId: string) => {\n const sandbox = await manager.sandbox.getById(sandboxId);\n return sandbox ? sandbox as TypedSandbox<TProvider> : null;\n },\n \n list: async () => {\n const sandboxes = await manager.sandbox.list();\n return sandboxes as TypedSandbox<TProvider>[];\n },\n \n destroy: async (sandboxId: string) => {\n return await manager.sandbox.destroy(sandboxId);\n }\n }\n } as TypedComputeAPI<TProvider>;\n}\n\n\n\n","/**\n * Simplified Request Handler for Web Framework Integration\n * \n * Handles JSON requests for sandbox and code execution operations.\n * Terminal support removed - will be re-added with WebSocket VM connections.\n */\n\nimport type { Provider, Runtime } from './types';\nimport { compute } from './compute';\n\n/**\n * Request structure supporting sandbox and code execution capabilities\n */\nexport interface ComputeRequest {\n /** Action in dot notation (e.g., 'compute.sandbox.create') */\n action: string;\n \n /** Parameters for the action */\n sandboxId?: string;\n code?: string;\n command?: string;\n args?: string[];\n runtime?: Runtime;\n path?: string;\n content?: string;\n \n /** Command options (for runCommand action) */\n commandOptions?: {\n background?: boolean;\n };\n \n /** Sandbox creation options */\n options?: {\n runtime?: Runtime;\n timeout?: number;\n sandboxId?: string;\n };\n}\n\n/**\n * Response structure for compute operations\n */\nexport interface ComputeResponse {\n success: boolean;\n error?: string;\n sandboxId: string;\n provider: string;\n [key: string]: any; // Allow any additional response data\n}\n\n/**\n * Execute compute action using targeted handling\n */\nasync function executeAction(body: ComputeRequest, provider: Provider): Promise<ComputeResponse> {\n try {\n const { action, sandboxId } = body;\n \n // Sandbox management operations\n if (action === 'compute.sandbox.create') {\n const sandbox = await compute.sandbox.create({\n provider,\n options: body.options || { runtime: 'python' }\n });\n return {\n success: true,\n sandboxId: sandbox.sandboxId,\n provider: provider.name\n };\n }\n \n if (action === 'compute.sandbox.list') {\n const sandboxes = await compute.sandbox.list(provider);\n return {\n success: true,\n sandboxId: '',\n provider: provider.name,\n sandboxes: sandboxes.map(sb => ({\n sandboxId: sb.sandboxId,\n provider: sb.provider\n }))\n };\n }\n \n if (action === 'compute.sandbox.destroy') {\n if (!sandboxId) {\n throw new Error('sandboxId is required for destroy action');\n }\n await compute.sandbox.destroy(provider, sandboxId);\n return {\n success: true,\n sandboxId,\n provider: provider.name\n };\n }\n \n // For sandbox instance methods, get the sandbox first\n if (!sandboxId) {\n throw new Error('sandboxId is required for this action');\n }\n \n const sandbox = await compute.sandbox.getById(provider, sandboxId);\n if (!sandbox) {\n throw new Error(`Sandbox ${sandboxId} not found`);\n }\n \n // Sandbox info\n if (action === 'compute.sandbox.getInfo') {\n const result = await sandbox.getInfo();\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n info: {\n id: result.id,\n provider: result.provider,\n runtime: result.runtime,\n status: result.status,\n createdAt: result.createdAt.toISOString(),\n timeout: result.timeout,\n metadata: result.metadata\n }\n };\n }\n \n // Code execution\n if (action === 'compute.sandbox.runCode') {\n if (!body.code) throw new Error('code is required');\n const result = await sandbox.runCode(body.code, body.runtime);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime\n }\n };\n }\n \n if (action === 'compute.sandbox.runCommand') {\n if (!body.command) throw new Error('command is required');\n const result = await sandbox.runCommand(body.command, body.args, body.commandOptions);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n result: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executionTime: result.executionTime,\n ...(result.isBackground && { isBackground: result.isBackground }),\n ...(result.pid && { pid: result.pid })\n }\n };\n }\n \n // Filesystem operations\n if (action === 'compute.sandbox.filesystem.readFile') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readFile(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n fileContent: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.writeFile') {\n if (!body.path) throw new Error('path is required');\n if (body.content === undefined) throw new Error('content is required');\n await sandbox.filesystem.writeFile(body.path, body.content);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.mkdir') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.mkdir(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n if (action === 'compute.sandbox.filesystem.readdir') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.readdir(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n files: result.map((entry: any) => ({\n name: entry.name,\n path: entry.path,\n isDirectory: entry.isDirectory,\n size: entry.size,\n lastModified: entry.lastModified.toISOString()\n }))\n };\n }\n \n if (action === 'compute.sandbox.filesystem.exists') {\n if (!body.path) throw new Error('path is required');\n const result = await sandbox.filesystem.exists(body.path);\n return {\n success: true,\n sandboxId,\n provider: provider.name,\n exists: result\n };\n }\n \n if (action === 'compute.sandbox.filesystem.remove') {\n if (!body.path) throw new Error('path is required');\n await sandbox.filesystem.remove(body.path);\n return { success: true, sandboxId, provider: provider.name };\n }\n \n throw new Error(`Unknown action: ${action}`);\n \n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n sandboxId: body.sandboxId || '',\n provider: provider.name\n };\n }\n}\n\n/**\n * Main request handler - handles HTTP requests and pre-parsed bodies\n */\nexport async function handleComputeRequest(\n params: HandleComputeRequestParams\n): Promise<ComputeResponse>;\nexport async function handleComputeRequest(\n requestOrBody: Request | ComputeRequest,\n provider: Provider\n): Promise<Response>;\nexport async function handleComputeRequest(\n paramsOrRequestOrBody: HandleComputeRequestParams | Request | ComputeRequest,\n provider?: Provider\n): Promise<ComputeResponse | Response> {\n // Handle object-style API\n if (typeof paramsOrRequestOrBody === 'object' && 'request' in paramsOrRequestOrBody && 'provider' in paramsOrRequestOrBody) {\n const params = paramsOrRequestOrBody as HandleComputeRequestParams;\n return await executeAction(params.request, params.provider);\n }\n \n // Handle original API\n if (!provider) {\n throw new Error('Provider is required when not using object-style API');\n }\n \n const requestOrBody = paramsOrRequestOrBody as Request | ComputeRequest;\n try {\n let body: ComputeRequest;\n \n if (requestOrBody instanceof Request) {\n // Handle HTTP method validation\n if (requestOrBody.method !== 'POST') {\n return Response.json({\n success: false,\n error: 'Only POST requests are supported',\n sandboxId: '',\n provider: provider.name\n }, { status: 405 });\n }\n \n // Parse JSON body with better error handling\n try {\n body = await requestOrBody.json();\n } catch (parseError) {\n return Response.json({\n success: false,\n error: 'Invalid JSON in request body',\n sandboxId: '',\n provider: provider.name\n }, { status: 400 });\n }\n } else {\n body = requestOrBody;\n }\n \n // Execute the action\n const result = await executeAction(body, provider);\n \n return Response.json(result, {\n status: result.success ? 200 : 500\n });\n \n } catch (error) {\n return Response.json({\n success: false,\n error: error instanceof Error ? error.message : 'Request handling failed',\n sandboxId: '',\n provider: provider.name\n }, { status: 500 });\n }\n}\n\n/**\n * Legacy export for backward compatibility\n */\nexport interface HandleComputeRequestParams {\n request: ComputeRequest;\n provider: Provider;\n}\n\nexport { handleComputeRequest as handleHttpComputeRequest };","/**\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\nimport type {\n Provider,\n ProviderSandboxManager,\n Sandbox,\n SandboxFileSystem,\n SandboxInfo,\n ExecutionResult,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from './types/index.js';\n\n/**\n * Helper function to handle background command execution\n * Providers can use this to implement background job support\n */\nexport function createBackgroundCommand(command: string, args: string[] = [], options?: RunCommandOptions): { command: string; args: string[]; isBackground: boolean } {\n if (!options?.background) {\n return { command, args, isBackground: false };\n }\n\n // For background execution, we modify the command to run in background\n // Default approach: append & to make it run in background\n const fullCommand = args.length > 0 ? `${command} ${args.join(' ')}` : command;\n \n return {\n command: 'sh',\n args: ['-c', `${fullCommand} &`],\n isBackground: true\n };\n}\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 // Instance operations (map to individual Sandbox methods)\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<ExecutionResult>;\n runCommand: (sandbox: TSandbox, command: string, args?: string[], options?: RunCommandOptions) => Promise<ExecutionResult>;\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, args?: string[]) => Promise<ExecutionResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, args?: string[]) => Promise<ExecutionResult>) => Promise<void>;\n };\n \n\n}\n\n/**\n * Provider configuration for createProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n };\n}\n\n/**\n * Default filesystem implementations based on shell commands\n * These work for any provider that supports shell command execution\n */\nconst defaultFilesystemMethods = {\n readFile: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<string> => {\n const result = await runCommand(sandbox, 'cat', [path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read file ${path}: ${result.stderr}`);\n }\n // Trim trailing newline that cat command adds\n return result.stdout.replace(/\\n$/, '');\n },\n\n writeFile: async (sandbox: any, path: string, content: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'sh', ['-c', `echo ${JSON.stringify(content)} > ${JSON.stringify(path)}`]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'mkdir', ['-p', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<FileEntry[]> => {\n // Try different ls variations for maximum compatibility\n let result = await runCommand(sandbox, 'ls', ['-la', path]);\n let hasDetailedOutput = true;\n \n // Fall back to basic ls if detailed flags not supported\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', ['-l', path]);\n }\n if (result.exitCode !== 0) {\n result = await runCommand(sandbox, 'ls', [path]);\n hasDetailedOutput = false;\n }\n \n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n\n const lines = (result.stdout || '').split('\\n').filter((line: string) => line.trim() && !line.startsWith('total'));\n\n return lines.map((line: string) => {\n if (hasDetailedOutput && line.includes(' ')) {\n // Parse detailed ls output (ls -la or ls -l)\n const parts = line.trim().split(/\\s+/);\n const name = parts[parts.length - 1];\n const isDirectory = line.startsWith('d');\n \n return {\n name,\n path: `${path}/${name}`,\n isDirectory,\n size: parseInt(parts[4]) || 0,\n lastModified: new Date()\n };\n } else {\n // Parse simple ls output (just filenames)\n const name = line.trim();\n return {\n name,\n path: `${path}/${name}`,\n isDirectory: false, // Can't determine from simple ls\n size: 0,\n lastModified: new Date()\n };\n }\n });\n },\n\n exists: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<boolean> => {\n const result = await runCommand(sandbox, 'test', ['-e', path]);\n return result.exitCode === 0; // Exit code 0 means file exists\n },\n\n remove: async (sandbox: any, path: string, runCommand: (sandbox: any, command: string, args?: string[]) => Promise<ExecutionResult>): Promise<void> => {\n const result = await runCommand(sandbox, 'rm', ['-rf', path]);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\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 Sandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements Sandbox {\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 getInstance<T extends TSandbox>(): T;\n getInstance<T extends TSandbox = TSandbox>(): T {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox) as T;\n }\n // Fallback to generic casting\n return this.sandbox as T;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<ExecutionResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(command: string, args?: string[], options?: RunCommandOptions): Promise<ExecutionResult> {\n return await this.methods.runCommand(this.sandbox, command, args, 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 {\n return this.providerInstance;\n }\n\n async kill(): Promise<void> {\n // For backward compatibility, kill() delegates to destroy()\n await this.destroy();\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 {\n private activeSandboxes: Map<string, GeneratedSandbox<TSandbox>> = new Map();\n\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<Sandbox> {\n const result = await this.methods.create(this.config, options);\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async getById(sandboxId: string): Promise<Sandbox | null> {\n // Check active sandboxes first\n const existing = this.activeSandboxes.get(sandboxId);\n if (existing) {\n return existing;\n }\n\n // Try to reconnect\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n const sandbox = new GeneratedSandbox(\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 this.activeSandboxes.set(result.sandboxId, sandbox);\n return sandbox;\n }\n\n async list(): Promise<Sandbox[]> {\n const results = await this.methods.list(this.config);\n const sandboxes: Sandbox[] = [];\n\n for (const result of results) {\n let sandbox = this.activeSandboxes.get(result.sandboxId);\n if (!sandbox) {\n sandbox = new GeneratedSandbox(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n this.activeSandboxes.set(result.sandboxId, sandbox);\n }\n sandboxes.push(sandbox);\n }\n\n return sandboxes;\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n this.activeSandboxes.delete(sandboxId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig> implements Provider {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\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 createProvider<TSandbox, TConfig>(\n providerConfig: ProviderConfig<TSandbox, TConfig>\n): (config: TConfig) => Provider {\n // Auto-inject default filesystem methods if none provided\n if (!providerConfig.methods.sandbox.filesystem) {\n providerConfig.methods.sandbox.filesystem = defaultFilesystemMethods;\n }\n\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}"],"mappings":"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","names":["sandbox"]}
|