@computesdk/provider 1.0.7 → 1.0.8

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 CHANGED
@@ -1,4 +1,4 @@
1
- import { CreateSandboxOptions, SandboxInterface, Runtime, CodeResult, RunCommandOptions, CommandResult, SandboxInfo, FileEntry } from 'computesdk';
1
+ import { CreateSandboxOptions, SandboxInterface, Runtime, CodeResult, RunCommandOptions, CommandResult, SandboxInfo, FileEntry, ExplicitComputeConfig, ProviderName, CallableCompute } from 'computesdk';
2
2
  export { CodeResult, CommandResult, CreateSandboxOptions, FileEntry, RunCommandOptions, Runtime, SandboxFileSystem, SandboxInfo, SandboxInterface } from 'computesdk';
3
3
 
4
4
  /**
@@ -151,7 +151,7 @@ interface Provider<TSandbox = any, TTemplate = any, TSnapshot = any> {
151
151
  /**
152
152
  * Configuration for the compute singleton
153
153
  */
154
- interface ComputeConfig<TProvider extends Provider = Provider> {
154
+ interface ComputeConfig$1<TProvider extends Provider = Provider> {
155
155
  /** Default provider to use when none is specified */
156
156
  defaultProvider?: TProvider;
157
157
  /** @deprecated Use defaultProvider instead. Kept for backwards compatibility */
@@ -190,8 +190,8 @@ interface CreateSandboxParamsWithOptionalProvider {
190
190
  */
191
191
  interface ComputeAPI$1 {
192
192
  /** Configuration management */
193
- setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void;
194
- getConfig(): ComputeConfig | null;
193
+ setConfig<TProvider extends Provider>(config: ComputeConfig$1<TProvider>): void;
194
+ getConfig(): ComputeConfig$1 | null;
195
195
  clearConfig(): void;
196
196
  sandbox: {
197
197
  /** Create a sandbox from a provider (or default provider if configured) */
@@ -218,7 +218,7 @@ interface ComputeAPI$1 {
218
218
  */
219
219
  interface TypedComputeAPI<TProvider extends Provider> extends Omit<ComputeAPI$1, 'sandbox' | 'setConfig'> {
220
220
  /** Configuration management that returns typed compute instance */
221
- setConfig<T extends Provider>(config: ComputeConfig<T>): TypedComputeAPI<T>;
221
+ setConfig<T extends Provider>(config: ComputeConfig$1<T>): TypedComputeAPI<T>;
222
222
  sandbox: {
223
223
  /** Create a sandbox from the configured provider with proper typing */
224
224
  create(params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>): Promise<TypedProviderSandbox<TProvider>>;
@@ -386,57 +386,195 @@ interface SnapshotMethods<TSnapshot = any, TConfig = any> {
386
386
  list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;
387
387
  delete: (config: TConfig, snapshotId: string) => Promise<void>;
388
388
  }
389
- /**
390
- * Provider execution modes
391
- *
392
- * - 'raw': Use raw provider methods directly (for gateway internal use)
393
- * - 'direct': Use provider's native SDK directly (for providers with sandbox capabilities)
394
- * - 'gateway': Route through ComputeSDK gateway (for providers without native sandbox)
395
- */
396
- type ProviderMode = 'raw' | 'direct' | 'gateway';
397
389
  /**
398
390
  * Provider configuration for defineProvider()
399
391
  */
400
392
  interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {
401
393
  name: string;
402
- /**
403
- * Default execution mode for this provider (defaults to 'gateway' if not specified)
404
- *
405
- * - 'direct': Provider has native sandbox capabilities (e.g., E2B) - uses provider SDK directly
406
- * - 'gateway': Provider only has infrastructure (e.g., Railway) - routes through gateway
407
- *
408
- * Can be overridden at runtime with `mode` in config.
409
- */
410
- defaultMode?: 'direct' | 'gateway';
411
394
  methods: {
412
395
  sandbox: SandboxMethods<TSandbox, TConfig>;
413
396
  template?: TemplateMethods<TTemplate, TConfig>;
414
397
  snapshot?: SnapshotMethods<TSnapshot, TConfig>;
415
398
  };
416
399
  }
417
- /**
418
- * Base config that all provider configs should extend
419
- * Includes the `mode` option for controlling execution mode
420
- */
421
- interface BaseProviderConfig {
422
- /**
423
- * Execution mode override
424
- *
425
- * - 'raw': Use raw provider methods directly (for gateway internal use)
426
- * - 'direct': Use provider's native SDK directly
427
- * - 'gateway': Route through ComputeSDK gateway
428
- *
429
- * If not specified, uses the provider's `defaultMode`.
430
- */
431
- mode?: ProviderMode;
432
- }
433
400
  /**
434
401
  * Create a provider from method definitions
435
402
  *
436
403
  * Auto-generates all boilerplate classes and provides feature detection
437
404
  * based on which methods are implemented.
438
405
  */
439
- declare function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>): (config: TConfig & BaseProviderConfig) => Provider<TSandbox, TTemplate, TSnapshot>;
406
+ declare function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot>;
407
+
408
+ /**
409
+ * Infrastructure Provider Factory
410
+ *
411
+ * Creates infrastructure-only providers that provision compute resources
412
+ * but don't have native sandbox capabilities. Used by gateway server.
413
+ */
414
+
415
+ /**
416
+ * Infrastructure provider methods - only resource provisioning
417
+ */
418
+ interface InfraProviderMethods<TInstance = any, TConfig = any> {
419
+ /** Create a new compute instance */
420
+ create: (config: TConfig, options?: CreateSandboxOptions & {
421
+ daemonConfig?: DaemonConfig;
422
+ }) => Promise<{
423
+ instance: TInstance;
424
+ instanceId: string;
425
+ }>;
426
+ /** Get an existing instance by ID */
427
+ getById: (config: TConfig, instanceId: string) => Promise<{
428
+ instance: TInstance;
429
+ instanceId: string;
430
+ } | null>;
431
+ /** List all instances */
432
+ list: (config: TConfig) => Promise<Array<{
433
+ instance: TInstance;
434
+ instanceId: string;
435
+ }>>;
436
+ /** Destroy an instance */
437
+ destroy: (config: TConfig, instanceId: string) => Promise<void>;
438
+ }
439
+ /**
440
+ * Daemon configuration passed to infrastructure providers
441
+ */
442
+ interface DaemonConfig {
443
+ /** Access token for daemon authentication */
444
+ accessToken: string;
445
+ /** Gateway URL for daemon to connect to */
446
+ gatewayUrl?: string;
447
+ /** Additional daemon environment variables */
448
+ env?: Record<string, string>;
449
+ }
450
+ /**
451
+ * Infrastructure provider configuration
452
+ */
453
+ interface InfraProviderConfig<TInstance = any, TConfig = any> {
454
+ name: string;
455
+ methods: InfraProviderMethods<TInstance, TConfig>;
456
+ }
457
+ /**
458
+ * Infrastructure provider interface returned by defineInfraProvider
459
+ */
460
+ interface InfraProvider<TInstance = any> {
461
+ name: string;
462
+ create: (options?: CreateSandboxOptions & {
463
+ daemonConfig?: DaemonConfig;
464
+ }) => Promise<{
465
+ instance: TInstance;
466
+ instanceId: string;
467
+ }>;
468
+ getById: (instanceId: string) => Promise<{
469
+ instance: TInstance;
470
+ instanceId: string;
471
+ } | null>;
472
+ list: () => Promise<Array<{
473
+ instance: TInstance;
474
+ instanceId: string;
475
+ }>>;
476
+ destroy: (instanceId: string) => Promise<void>;
477
+ }
478
+ /**
479
+ * Create an infrastructure provider from method definitions
480
+ *
481
+ * Infrastructure providers only handle resource provisioning.
482
+ * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.
483
+ *
484
+ * @example
485
+ * ```typescript
486
+ * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({
487
+ * name: 'railway',
488
+ * methods: {
489
+ * create: async (config, options) => {
490
+ * // Create Railway service with daemon docker image
491
+ * const service = await railwayAPI.createService({
492
+ * ...config,
493
+ * image: 'computesdk/daemon:latest',
494
+ * env: options?.daemonConfig ? {
495
+ * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,
496
+ * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,
497
+ * } : {}
498
+ * });
499
+ * return { instance: service, instanceId: service.id };
500
+ * },
501
+ * destroy: async (config, instanceId) => {
502
+ * await railwayAPI.deleteService(config, instanceId);
503
+ * },
504
+ * getById: async (config, instanceId) => {
505
+ * const service = await railwayAPI.getService(config, instanceId);
506
+ * return service ? { instance: service, instanceId: service.id } : null;
507
+ * },
508
+ * list: async (config) => {
509
+ * const services = await railwayAPI.listServices(config);
510
+ * return services.map(s => ({ instance: s, instanceId: s.id }));
511
+ * }
512
+ * }
513
+ * });
514
+ *
515
+ * // Gateway server usage:
516
+ * const provider = railway({ apiKey, projectId, environmentId });
517
+ * const { instance, instanceId } = await provider.create({
518
+ * daemonConfig: { accessToken: 'token_xxx' }
519
+ * });
520
+ * ```
521
+ */
522
+ declare function defineInfraProvider<TInstance, TConfig = any>(config: InfraProviderConfig<TInstance, TConfig>): (providerConfig: TConfig) => InfraProvider<TInstance>;
523
+
524
+ /**
525
+ * Compute Factory
526
+ *
527
+ * Creates compute instance factories for infrastructure providers.
528
+ * Allows providers like Railway to feel like first-class citizens while
529
+ * routing through the gateway.
530
+ */
531
+
532
+ /**
533
+ * Compute factory configuration
534
+ */
535
+ interface ComputeFactoryConfig {
536
+ /** Provider name (must match gateway provider name) */
537
+ provider: ProviderName;
538
+ }
539
+ /**
540
+ * Base config for compute factories.
541
+ * Omits 'provider' since that's set by the factory, not the user.
542
+ */
543
+ type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;
544
+ /**
545
+ * Create a compute instance factory for infrastructure providers
546
+ *
547
+ * This allows infrastructure providers like Railway to have their own
548
+ * packages while routing through the gateway. Returns a function that
549
+ * creates pre-configured compute instances.
550
+ *
551
+ * **Note:** This configures the global `compute` singleton. The returned
552
+ * instance shares global state - calling this multiple times with different
553
+ * configs will override previous configurations. This is intentional as
554
+ * the compute singleton is designed to be configured once per application.
555
+ *
556
+ * @example
557
+ * ```typescript
558
+ * // Define Railway compute factory
559
+ * export const railway = defineCompute<RailwayConfig>({
560
+ * provider: 'railway'
561
+ * });
562
+ *
563
+ * // User code:
564
+ * import { railway } from '@computesdk/railway';
565
+ *
566
+ * const compute = railway({
567
+ * apiKey: 'railway_xxx',
568
+ * projectId: 'project_xxx',
569
+ * environmentId: 'env_xxx'
570
+ * });
571
+ *
572
+ * // Full compute API available
573
+ * const sandbox = await compute.sandbox.create();
574
+ * await sandbox.runCode('console.log("hello")');
575
+ * ```
576
+ */
577
+ declare function defineCompute<TConfig extends ComputeConfig>(factoryConfig: ComputeFactoryConfig): (config: TConfig) => CallableCompute;
440
578
 
441
579
  /**
442
580
  * Direct Mode Compute API
@@ -532,4 +670,4 @@ declare function calculateBackoff(attempt: number, baseDelay?: number, jitterMax
532
670
  */
533
671
  declare function escapeShellArg(arg: string): string;
534
672
 
535
- export { type BaseProviderConfig, type BlaxelProviderConfig, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaytonaProviderConfig, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type Provider, type ProviderConfig, type ProviderMode, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type SnapshotMethods, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type VercelProviderConfig, calculateBackoff, createCompute, defineProvider, escapeShellArg };
673
+ export { type BlaxelProviderConfig, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type ComputeFactoryConfig, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaemonConfig, type DaytonaProviderConfig, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type InfraProvider, type InfraProviderConfig, type InfraProviderMethods, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type Provider, type ProviderConfig, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type SnapshotMethods, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type VercelProviderConfig, calculateBackoff, createCompute, defineCompute, defineInfraProvider, defineProvider, escapeShellArg };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { CreateSandboxOptions, SandboxInterface, Runtime, CodeResult, RunCommandOptions, CommandResult, SandboxInfo, FileEntry } from 'computesdk';
1
+ import { CreateSandboxOptions, SandboxInterface, Runtime, CodeResult, RunCommandOptions, CommandResult, SandboxInfo, FileEntry, ExplicitComputeConfig, ProviderName, CallableCompute } from 'computesdk';
2
2
  export { CodeResult, CommandResult, CreateSandboxOptions, FileEntry, RunCommandOptions, Runtime, SandboxFileSystem, SandboxInfo, SandboxInterface } from 'computesdk';
3
3
 
4
4
  /**
@@ -151,7 +151,7 @@ interface Provider<TSandbox = any, TTemplate = any, TSnapshot = any> {
151
151
  /**
152
152
  * Configuration for the compute singleton
153
153
  */
154
- interface ComputeConfig<TProvider extends Provider = Provider> {
154
+ interface ComputeConfig$1<TProvider extends Provider = Provider> {
155
155
  /** Default provider to use when none is specified */
156
156
  defaultProvider?: TProvider;
157
157
  /** @deprecated Use defaultProvider instead. Kept for backwards compatibility */
@@ -190,8 +190,8 @@ interface CreateSandboxParamsWithOptionalProvider {
190
190
  */
191
191
  interface ComputeAPI$1 {
192
192
  /** Configuration management */
193
- setConfig<TProvider extends Provider>(config: ComputeConfig<TProvider>): void;
194
- getConfig(): ComputeConfig | null;
193
+ setConfig<TProvider extends Provider>(config: ComputeConfig$1<TProvider>): void;
194
+ getConfig(): ComputeConfig$1 | null;
195
195
  clearConfig(): void;
196
196
  sandbox: {
197
197
  /** Create a sandbox from a provider (or default provider if configured) */
@@ -218,7 +218,7 @@ interface ComputeAPI$1 {
218
218
  */
219
219
  interface TypedComputeAPI<TProvider extends Provider> extends Omit<ComputeAPI$1, 'sandbox' | 'setConfig'> {
220
220
  /** Configuration management that returns typed compute instance */
221
- setConfig<T extends Provider>(config: ComputeConfig<T>): TypedComputeAPI<T>;
221
+ setConfig<T extends Provider>(config: ComputeConfig$1<T>): TypedComputeAPI<T>;
222
222
  sandbox: {
223
223
  /** Create a sandbox from the configured provider with proper typing */
224
224
  create(params?: Omit<CreateSandboxParamsWithOptionalProvider, 'provider'>): Promise<TypedProviderSandbox<TProvider>>;
@@ -386,57 +386,195 @@ interface SnapshotMethods<TSnapshot = any, TConfig = any> {
386
386
  list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;
387
387
  delete: (config: TConfig, snapshotId: string) => Promise<void>;
388
388
  }
389
- /**
390
- * Provider execution modes
391
- *
392
- * - 'raw': Use raw provider methods directly (for gateway internal use)
393
- * - 'direct': Use provider's native SDK directly (for providers with sandbox capabilities)
394
- * - 'gateway': Route through ComputeSDK gateway (for providers without native sandbox)
395
- */
396
- type ProviderMode = 'raw' | 'direct' | 'gateway';
397
389
  /**
398
390
  * Provider configuration for defineProvider()
399
391
  */
400
392
  interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {
401
393
  name: string;
402
- /**
403
- * Default execution mode for this provider (defaults to 'gateway' if not specified)
404
- *
405
- * - 'direct': Provider has native sandbox capabilities (e.g., E2B) - uses provider SDK directly
406
- * - 'gateway': Provider only has infrastructure (e.g., Railway) - routes through gateway
407
- *
408
- * Can be overridden at runtime with `mode` in config.
409
- */
410
- defaultMode?: 'direct' | 'gateway';
411
394
  methods: {
412
395
  sandbox: SandboxMethods<TSandbox, TConfig>;
413
396
  template?: TemplateMethods<TTemplate, TConfig>;
414
397
  snapshot?: SnapshotMethods<TSnapshot, TConfig>;
415
398
  };
416
399
  }
417
- /**
418
- * Base config that all provider configs should extend
419
- * Includes the `mode` option for controlling execution mode
420
- */
421
- interface BaseProviderConfig {
422
- /**
423
- * Execution mode override
424
- *
425
- * - 'raw': Use raw provider methods directly (for gateway internal use)
426
- * - 'direct': Use provider's native SDK directly
427
- * - 'gateway': Route through ComputeSDK gateway
428
- *
429
- * If not specified, uses the provider's `defaultMode`.
430
- */
431
- mode?: ProviderMode;
432
- }
433
400
  /**
434
401
  * Create a provider from method definitions
435
402
  *
436
403
  * Auto-generates all boilerplate classes and provides feature detection
437
404
  * based on which methods are implemented.
438
405
  */
439
- declare function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>): (config: TConfig & BaseProviderConfig) => Provider<TSandbox, TTemplate, TSnapshot>;
406
+ declare function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot>;
407
+
408
+ /**
409
+ * Infrastructure Provider Factory
410
+ *
411
+ * Creates infrastructure-only providers that provision compute resources
412
+ * but don't have native sandbox capabilities. Used by gateway server.
413
+ */
414
+
415
+ /**
416
+ * Infrastructure provider methods - only resource provisioning
417
+ */
418
+ interface InfraProviderMethods<TInstance = any, TConfig = any> {
419
+ /** Create a new compute instance */
420
+ create: (config: TConfig, options?: CreateSandboxOptions & {
421
+ daemonConfig?: DaemonConfig;
422
+ }) => Promise<{
423
+ instance: TInstance;
424
+ instanceId: string;
425
+ }>;
426
+ /** Get an existing instance by ID */
427
+ getById: (config: TConfig, instanceId: string) => Promise<{
428
+ instance: TInstance;
429
+ instanceId: string;
430
+ } | null>;
431
+ /** List all instances */
432
+ list: (config: TConfig) => Promise<Array<{
433
+ instance: TInstance;
434
+ instanceId: string;
435
+ }>>;
436
+ /** Destroy an instance */
437
+ destroy: (config: TConfig, instanceId: string) => Promise<void>;
438
+ }
439
+ /**
440
+ * Daemon configuration passed to infrastructure providers
441
+ */
442
+ interface DaemonConfig {
443
+ /** Access token for daemon authentication */
444
+ accessToken: string;
445
+ /** Gateway URL for daemon to connect to */
446
+ gatewayUrl?: string;
447
+ /** Additional daemon environment variables */
448
+ env?: Record<string, string>;
449
+ }
450
+ /**
451
+ * Infrastructure provider configuration
452
+ */
453
+ interface InfraProviderConfig<TInstance = any, TConfig = any> {
454
+ name: string;
455
+ methods: InfraProviderMethods<TInstance, TConfig>;
456
+ }
457
+ /**
458
+ * Infrastructure provider interface returned by defineInfraProvider
459
+ */
460
+ interface InfraProvider<TInstance = any> {
461
+ name: string;
462
+ create: (options?: CreateSandboxOptions & {
463
+ daemonConfig?: DaemonConfig;
464
+ }) => Promise<{
465
+ instance: TInstance;
466
+ instanceId: string;
467
+ }>;
468
+ getById: (instanceId: string) => Promise<{
469
+ instance: TInstance;
470
+ instanceId: string;
471
+ } | null>;
472
+ list: () => Promise<Array<{
473
+ instance: TInstance;
474
+ instanceId: string;
475
+ }>>;
476
+ destroy: (instanceId: string) => Promise<void>;
477
+ }
478
+ /**
479
+ * Create an infrastructure provider from method definitions
480
+ *
481
+ * Infrastructure providers only handle resource provisioning.
482
+ * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.
483
+ *
484
+ * @example
485
+ * ```typescript
486
+ * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({
487
+ * name: 'railway',
488
+ * methods: {
489
+ * create: async (config, options) => {
490
+ * // Create Railway service with daemon docker image
491
+ * const service = await railwayAPI.createService({
492
+ * ...config,
493
+ * image: 'computesdk/daemon:latest',
494
+ * env: options?.daemonConfig ? {
495
+ * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,
496
+ * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,
497
+ * } : {}
498
+ * });
499
+ * return { instance: service, instanceId: service.id };
500
+ * },
501
+ * destroy: async (config, instanceId) => {
502
+ * await railwayAPI.deleteService(config, instanceId);
503
+ * },
504
+ * getById: async (config, instanceId) => {
505
+ * const service = await railwayAPI.getService(config, instanceId);
506
+ * return service ? { instance: service, instanceId: service.id } : null;
507
+ * },
508
+ * list: async (config) => {
509
+ * const services = await railwayAPI.listServices(config);
510
+ * return services.map(s => ({ instance: s, instanceId: s.id }));
511
+ * }
512
+ * }
513
+ * });
514
+ *
515
+ * // Gateway server usage:
516
+ * const provider = railway({ apiKey, projectId, environmentId });
517
+ * const { instance, instanceId } = await provider.create({
518
+ * daemonConfig: { accessToken: 'token_xxx' }
519
+ * });
520
+ * ```
521
+ */
522
+ declare function defineInfraProvider<TInstance, TConfig = any>(config: InfraProviderConfig<TInstance, TConfig>): (providerConfig: TConfig) => InfraProvider<TInstance>;
523
+
524
+ /**
525
+ * Compute Factory
526
+ *
527
+ * Creates compute instance factories for infrastructure providers.
528
+ * Allows providers like Railway to feel like first-class citizens while
529
+ * routing through the gateway.
530
+ */
531
+
532
+ /**
533
+ * Compute factory configuration
534
+ */
535
+ interface ComputeFactoryConfig {
536
+ /** Provider name (must match gateway provider name) */
537
+ provider: ProviderName;
538
+ }
539
+ /**
540
+ * Base config for compute factories.
541
+ * Omits 'provider' since that's set by the factory, not the user.
542
+ */
543
+ type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;
544
+ /**
545
+ * Create a compute instance factory for infrastructure providers
546
+ *
547
+ * This allows infrastructure providers like Railway to have their own
548
+ * packages while routing through the gateway. Returns a function that
549
+ * creates pre-configured compute instances.
550
+ *
551
+ * **Note:** This configures the global `compute` singleton. The returned
552
+ * instance shares global state - calling this multiple times with different
553
+ * configs will override previous configurations. This is intentional as
554
+ * the compute singleton is designed to be configured once per application.
555
+ *
556
+ * @example
557
+ * ```typescript
558
+ * // Define Railway compute factory
559
+ * export const railway = defineCompute<RailwayConfig>({
560
+ * provider: 'railway'
561
+ * });
562
+ *
563
+ * // User code:
564
+ * import { railway } from '@computesdk/railway';
565
+ *
566
+ * const compute = railway({
567
+ * apiKey: 'railway_xxx',
568
+ * projectId: 'project_xxx',
569
+ * environmentId: 'env_xxx'
570
+ * });
571
+ *
572
+ * // Full compute API available
573
+ * const sandbox = await compute.sandbox.create();
574
+ * await sandbox.runCode('console.log("hello")');
575
+ * ```
576
+ */
577
+ declare function defineCompute<TConfig extends ComputeConfig>(factoryConfig: ComputeFactoryConfig): (config: TConfig) => CallableCompute;
440
578
 
441
579
  /**
442
580
  * Direct Mode Compute API
@@ -532,4 +670,4 @@ declare function calculateBackoff(attempt: number, baseDelay?: number, jitterMax
532
670
  */
533
671
  declare function escapeShellArg(arg: string): string;
534
672
 
535
- export { type BaseProviderConfig, type BlaxelProviderConfig, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaytonaProviderConfig, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type Provider, type ProviderConfig, type ProviderMode, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type SnapshotMethods, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type VercelProviderConfig, calculateBackoff, createCompute, defineProvider, escapeShellArg };
673
+ export { type BlaxelProviderConfig, type CloudflareProviderConfig, type CodesandboxProviderConfig, type ComputeAPI, type ComputeConfig, type ComputeFactoryConfig, type CreateComputeConfig, type CreateSandboxParams, type CreateSandboxParamsWithOptionalProvider, type CreateSnapshotOptions, type CreateTemplateOptions, type DaemonConfig, type DaytonaProviderConfig, type E2BProviderConfig, type ExtendTimeoutOptions, type ExtractProviderSandboxType, type FindOrCreateSandboxOptions, type FindSandboxOptions, type InfraProvider, type InfraProviderConfig, type InfraProviderMethods, type ListSnapshotsOptions, type ListTemplatesOptions, type ModalProviderConfig, type Provider, type ProviderConfig, type ProviderSandbox, type ProviderSandboxManager, type ProviderSnapshotManager, type ProviderTemplateManager, type RailwayProviderConfig, type RunloopProviderConfig, type SandboxMethods, type SnapshotMethods, type TemplateMethods, type TypedComputeAPI, type TypedProviderSandbox, type VercelProviderConfig, calculateBackoff, createCompute, defineCompute, defineInfraProvider, defineProvider, escapeShellArg };
package/dist/index.js CHANGED
@@ -22,6 +22,8 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  calculateBackoff: () => calculateBackoff,
24
24
  createCompute: () => createCompute,
25
+ defineCompute: () => defineCompute,
26
+ defineInfraProvider: () => defineInfraProvider,
25
27
  defineProvider: () => defineProvider,
26
28
  escapeShellArg: () => escapeShellArg
27
29
  });
@@ -116,19 +118,12 @@ var GeneratedSandbox = class {
116
118
  await this.destroyMethod(this.config, this.sandboxId);
117
119
  }
118
120
  };
119
- function getEffectiveMode(config, defaultMode) {
120
- if (config.mode) {
121
- return config.mode;
122
- }
123
- return defaultMode;
124
- }
125
121
  var GeneratedSandboxManager = class {
126
- constructor(config, providerName, methods, providerInstance, defaultMode) {
122
+ constructor(config, providerName, methods, providerInstance) {
127
123
  this.config = config;
128
124
  this.providerName = providerName;
129
125
  this.methods = methods;
130
126
  this.providerInstance = providerInstance;
131
- this.effectiveMode = getEffectiveMode(config, defaultMode);
132
127
  }
133
128
  async create(options) {
134
129
  const optionsWithDefaults = { runtime: "node", ...options };
@@ -259,8 +254,7 @@ var GeneratedProvider = class {
259
254
  config,
260
255
  providerConfig.name,
261
256
  providerConfig.methods.sandbox,
262
- this,
263
- providerConfig.defaultMode ?? "gateway"
257
+ this
264
258
  );
265
259
  if (providerConfig.methods.template) {
266
260
  this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);
@@ -279,6 +273,39 @@ function defineProvider(providerConfig) {
279
273
  };
280
274
  }
281
275
 
276
+ // src/infra-factory.ts
277
+ function defineInfraProvider(config) {
278
+ return (providerConfig) => {
279
+ return {
280
+ name: config.name,
281
+ create: async (options) => {
282
+ return await config.methods.create(providerConfig, options);
283
+ },
284
+ getById: async (instanceId) => {
285
+ return await config.methods.getById(providerConfig, instanceId);
286
+ },
287
+ list: async () => {
288
+ return await config.methods.list(providerConfig);
289
+ },
290
+ destroy: async (instanceId) => {
291
+ await config.methods.destroy(providerConfig, instanceId);
292
+ }
293
+ };
294
+ };
295
+ }
296
+
297
+ // src/compute-factory.ts
298
+ var import_computesdk = require("computesdk");
299
+ function defineCompute(factoryConfig) {
300
+ return (config) => {
301
+ import_computesdk.compute.setConfig({
302
+ ...config,
303
+ provider: factoryConfig.provider
304
+ });
305
+ return import_computesdk.compute;
306
+ };
307
+ }
308
+
282
309
  // src/compute.ts
283
310
  function createCompute(config) {
284
311
  const provider = config.defaultProvider || config.provider;
@@ -313,6 +340,8 @@ function escapeShellArg(arg) {
313
340
  0 && (module.exports = {
314
341
  calculateBackoff,
315
342
  createCompute,
343
+ defineCompute,
344
+ defineInfraProvider,
316
345
  defineProvider,
317
346
  escapeShellArg
318
347
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/factory.ts","../src/compute.ts","../src/utils.ts"],"sourcesContent":["/**\n * @computesdk/provider - Provider Framework\n * \n * Build custom sandbox providers for ComputeSDK.\n * This package provides the factory and types needed to create providers.\n */\n\n// Export factory\nexport { defineProvider } from './factory';\nexport type { \n ProviderConfig, \n SandboxMethods, \n TemplateMethods, \n SnapshotMethods, \n BaseProviderConfig, \n ProviderMode \n} from './factory';\n\n// Export direct mode compute API\nexport { createCompute } from './compute';\nexport type { CreateComputeConfig, ComputeAPI } from './compute';\n\n// Export utilities\nexport { calculateBackoff, escapeShellArg } from './utils';\n\n// Export all types\nexport type * from './types';\n","/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider execution modes\n *\n * - 'raw': Use raw provider methods directly (for gateway internal use)\n * - 'direct': Use provider's native SDK directly (for providers with sandbox capabilities)\n * - 'gateway': Route through ComputeSDK gateway (for providers without native sandbox)\n */\nexport type ProviderMode = 'raw' | 'direct' | 'gateway';\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n /**\n * Default execution mode for this provider (defaults to 'gateway' if not specified)\n *\n * - 'direct': Provider has native sandbox capabilities (e.g., E2B) - uses provider SDK directly\n * - 'gateway': Provider only has infrastructure (e.g., Railway) - routes through gateway\n *\n * Can be overridden at runtime with `mode` in config.\n */\n defaultMode?: 'direct' | 'gateway';\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Base config that all provider configs should extend\n * Includes the `mode` option for controlling execution mode\n */\nexport interface BaseProviderConfig {\n /**\n * Execution mode override\n *\n * - 'raw': Use raw provider methods directly (for gateway internal use)\n * - 'direct': Use provider's native SDK directly\n * - 'gateway': Route through ComputeSDK gateway\n *\n * If not specified, uses the provider's `defaultMode`.\n */\n mode?: ProviderMode;\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Determines the effective execution mode\n *\n * @param config - Runtime config (may contain `mode` override)\n * @param defaultMode - Provider's default mode\n * @returns The effective execution mode\n */\nfunction getEffectiveMode(config: BaseProviderConfig, defaultMode: 'direct' | 'gateway'): ProviderMode {\n // If mode is explicitly set in config, use it\n if (config.mode) {\n return config.mode;\n }\n\n // Otherwise use provider's default mode\n return defaultMode;\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n private readonly effectiveMode: ProviderMode;\n\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider,\n defaultMode: 'direct' | 'gateway'\n ) {\n this.effectiveMode = getEffectiveMode(config as BaseProviderConfig, defaultMode);\n }\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this,\n providerConfig.defaultMode ?? 'gateway'\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig & BaseProviderConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig & BaseProviderConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/factory.ts","../src/infra-factory.ts","../src/compute-factory.ts","../src/compute.ts","../src/utils.ts"],"sourcesContent":["/**\n * @computesdk/provider - Provider Framework\n * \n * Build custom sandbox providers for ComputeSDK.\n * This package provides the factory and types needed to create providers.\n */\n\n// Export factories\nexport { defineProvider } from './factory';\nexport type { \n ProviderConfig, \n SandboxMethods, \n TemplateMethods, \n SnapshotMethods\n} from './factory';\n\nexport { defineInfraProvider } from './infra-factory';\nexport type {\n InfraProviderConfig,\n InfraProviderMethods,\n InfraProvider,\n DaemonConfig\n} from './infra-factory';\n\nexport { defineCompute } from './compute-factory';\nexport type {\n ComputeFactoryConfig,\n ComputeConfig\n} from './compute-factory';\n\n// Export direct mode compute API\nexport { createCompute } from './compute';\nexport type { CreateComputeConfig, ComputeAPI } from './compute';\n\n// Export utilities\nexport { calculateBackoff, escapeShellArg } from './utils';\n\n// Export all types\nexport type * from './types';\n","/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Infrastructure Provider Factory\n * \n * Creates infrastructure-only providers that provision compute resources\n * but don't have native sandbox capabilities. Used by gateway server.\n */\n\nimport type { CreateSandboxOptions } from './types/index.js';\n\n/**\n * Infrastructure provider methods - only resource provisioning\n */\nexport interface InfraProviderMethods<TInstance = any, TConfig = any> {\n /** Create a new compute instance */\n create: (config: TConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n \n /** Get an existing instance by ID */\n getById: (config: TConfig, instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n \n /** List all instances */\n list: (config: TConfig) => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n \n /** Destroy an instance */\n destroy: (config: TConfig, instanceId: string) => Promise<void>;\n}\n\n/**\n * Daemon configuration passed to infrastructure providers\n */\nexport interface DaemonConfig {\n /** Access token for daemon authentication */\n accessToken: string;\n /** Gateway URL for daemon to connect to */\n gatewayUrl?: string;\n /** Additional daemon environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Infrastructure provider configuration\n */\nexport interface InfraProviderConfig<TInstance = any, TConfig = any> {\n name: string;\n methods: InfraProviderMethods<TInstance, TConfig>;\n}\n\n/**\n * Infrastructure provider interface returned by defineInfraProvider\n */\nexport interface InfraProvider<TInstance = any> {\n name: string;\n create: (options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n getById: (instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n list: () => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n destroy: (instanceId: string) => Promise<void>;\n}\n\n/**\n * Create an infrastructure provider from method definitions\n * \n * Infrastructure providers only handle resource provisioning.\n * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.\n * \n * @example\n * ```typescript\n * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n * name: 'railway',\n * methods: {\n * create: async (config, options) => {\n * // Create Railway service with daemon docker image\n * const service = await railwayAPI.createService({\n * ...config,\n * image: 'computesdk/daemon:latest',\n * env: options?.daemonConfig ? {\n * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,\n * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,\n * } : {}\n * });\n * return { instance: service, instanceId: service.id };\n * },\n * destroy: async (config, instanceId) => {\n * await railwayAPI.deleteService(config, instanceId);\n * },\n * getById: async (config, instanceId) => {\n * const service = await railwayAPI.getService(config, instanceId);\n * return service ? { instance: service, instanceId: service.id } : null;\n * },\n * list: async (config) => {\n * const services = await railwayAPI.listServices(config);\n * return services.map(s => ({ instance: s, instanceId: s.id }));\n * }\n * }\n * });\n * \n * // Gateway server usage:\n * const provider = railway({ apiKey, projectId, environmentId });\n * const { instance, instanceId } = await provider.create({\n * daemonConfig: { accessToken: 'token_xxx' }\n * });\n * ```\n */\nexport function defineInfraProvider<TInstance, TConfig = any>(\n config: InfraProviderConfig<TInstance, TConfig>\n): (providerConfig: TConfig) => InfraProvider<TInstance> {\n return (providerConfig: TConfig) => {\n return {\n name: config.name,\n \n create: async (options) => {\n return await config.methods.create(providerConfig, options);\n },\n \n getById: async (instanceId) => {\n return await config.methods.getById(providerConfig, instanceId);\n },\n \n list: async () => {\n return await config.methods.list(providerConfig);\n },\n \n destroy: async (instanceId) => {\n await config.methods.destroy(providerConfig, instanceId);\n }\n };\n };\n}\n","/**\n * Compute Factory\n *\n * Creates compute instance factories for infrastructure providers.\n * Allows providers like Railway to feel like first-class citizens while\n * routing through the gateway.\n */\n\nimport { compute, type CallableCompute, type ExplicitComputeConfig, type ProviderName } from 'computesdk';\n\n/**\n * Compute factory configuration\n */\nexport interface ComputeFactoryConfig {\n /** Provider name (must match gateway provider name) */\n provider: ProviderName;\n}\n\n/**\n * Base config for compute factories.\n * Omits 'provider' since that's set by the factory, not the user.\n */\nexport type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;\n\n/**\n * Create a compute instance factory for infrastructure providers\n *\n * This allows infrastructure providers like Railway to have their own\n * packages while routing through the gateway. Returns a function that\n * creates pre-configured compute instances.\n *\n * **Note:** This configures the global `compute` singleton. The returned\n * instance shares global state - calling this multiple times with different\n * configs will override previous configurations. This is intentional as\n * the compute singleton is designed to be configured once per application.\n *\n * @example\n * ```typescript\n * // Define Railway compute factory\n * export const railway = defineCompute<RailwayConfig>({\n * provider: 'railway'\n * });\n *\n * // User code:\n * import { railway } from '@computesdk/railway';\n *\n * const compute = railway({\n * apiKey: 'railway_xxx',\n * projectId: 'project_xxx',\n * environmentId: 'env_xxx'\n * });\n *\n * // Full compute API available\n * const sandbox = await compute.sandbox.create();\n * await sandbox.runCode('console.log(\"hello\")');\n * ```\n */\nexport function defineCompute<TConfig extends ComputeConfig>(\n factoryConfig: ComputeFactoryConfig\n): (config: TConfig) => CallableCompute {\n return (config: TConfig) => {\n compute.setConfig({\n ...config,\n provider: factoryConfig.provider,\n });\n return compute;\n };\n}\n","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -87,19 +87,12 @@ var GeneratedSandbox = class {
87
87
  await this.destroyMethod(this.config, this.sandboxId);
88
88
  }
89
89
  };
90
- function getEffectiveMode(config, defaultMode) {
91
- if (config.mode) {
92
- return config.mode;
93
- }
94
- return defaultMode;
95
- }
96
90
  var GeneratedSandboxManager = class {
97
- constructor(config, providerName, methods, providerInstance, defaultMode) {
91
+ constructor(config, providerName, methods, providerInstance) {
98
92
  this.config = config;
99
93
  this.providerName = providerName;
100
94
  this.methods = methods;
101
95
  this.providerInstance = providerInstance;
102
- this.effectiveMode = getEffectiveMode(config, defaultMode);
103
96
  }
104
97
  async create(options) {
105
98
  const optionsWithDefaults = { runtime: "node", ...options };
@@ -230,8 +223,7 @@ var GeneratedProvider = class {
230
223
  config,
231
224
  providerConfig.name,
232
225
  providerConfig.methods.sandbox,
233
- this,
234
- providerConfig.defaultMode ?? "gateway"
226
+ this
235
227
  );
236
228
  if (providerConfig.methods.template) {
237
229
  this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);
@@ -250,6 +242,39 @@ function defineProvider(providerConfig) {
250
242
  };
251
243
  }
252
244
 
245
+ // src/infra-factory.ts
246
+ function defineInfraProvider(config) {
247
+ return (providerConfig) => {
248
+ return {
249
+ name: config.name,
250
+ create: async (options) => {
251
+ return await config.methods.create(providerConfig, options);
252
+ },
253
+ getById: async (instanceId) => {
254
+ return await config.methods.getById(providerConfig, instanceId);
255
+ },
256
+ list: async () => {
257
+ return await config.methods.list(providerConfig);
258
+ },
259
+ destroy: async (instanceId) => {
260
+ await config.methods.destroy(providerConfig, instanceId);
261
+ }
262
+ };
263
+ };
264
+ }
265
+
266
+ // src/compute-factory.ts
267
+ import { compute } from "computesdk";
268
+ function defineCompute(factoryConfig) {
269
+ return (config) => {
270
+ compute.setConfig({
271
+ ...config,
272
+ provider: factoryConfig.provider
273
+ });
274
+ return compute;
275
+ };
276
+ }
277
+
253
278
  // src/compute.ts
254
279
  function createCompute(config) {
255
280
  const provider = config.defaultProvider || config.provider;
@@ -283,6 +308,8 @@ function escapeShellArg(arg) {
283
308
  export {
284
309
  calculateBackoff,
285
310
  createCompute,
311
+ defineCompute,
312
+ defineInfraProvider,
286
313
  defineProvider,
287
314
  escapeShellArg
288
315
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/factory.ts","../src/compute.ts","../src/utils.ts"],"sourcesContent":["/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider execution modes\n *\n * - 'raw': Use raw provider methods directly (for gateway internal use)\n * - 'direct': Use provider's native SDK directly (for providers with sandbox capabilities)\n * - 'gateway': Route through ComputeSDK gateway (for providers without native sandbox)\n */\nexport type ProviderMode = 'raw' | 'direct' | 'gateway';\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n /**\n * Default execution mode for this provider (defaults to 'gateway' if not specified)\n *\n * - 'direct': Provider has native sandbox capabilities (e.g., E2B) - uses provider SDK directly\n * - 'gateway': Provider only has infrastructure (e.g., Railway) - routes through gateway\n *\n * Can be overridden at runtime with `mode` in config.\n */\n defaultMode?: 'direct' | 'gateway';\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Base config that all provider configs should extend\n * Includes the `mode` option for controlling execution mode\n */\nexport interface BaseProviderConfig {\n /**\n * Execution mode override\n *\n * - 'raw': Use raw provider methods directly (for gateway internal use)\n * - 'direct': Use provider's native SDK directly\n * - 'gateway': Route through ComputeSDK gateway\n *\n * If not specified, uses the provider's `defaultMode`.\n */\n mode?: ProviderMode;\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Determines the effective execution mode\n *\n * @param config - Runtime config (may contain `mode` override)\n * @param defaultMode - Provider's default mode\n * @returns The effective execution mode\n */\nfunction getEffectiveMode(config: BaseProviderConfig, defaultMode: 'direct' | 'gateway'): ProviderMode {\n // If mode is explicitly set in config, use it\n if (config.mode) {\n return config.mode;\n }\n\n // Otherwise use provider's default mode\n return defaultMode;\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n private readonly effectiveMode: ProviderMode;\n\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider,\n defaultMode: 'direct' | 'gateway'\n ) {\n this.effectiveMode = getEffectiveMode(config as BaseProviderConfig, defaultMode);\n }\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this,\n providerConfig.defaultMode ?? 'gateway'\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig & BaseProviderConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig & BaseProviderConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/factory.ts","../src/infra-factory.ts","../src/compute-factory.ts","../src/compute.ts","../src/utils.ts"],"sourcesContent":["/**\n * Provider Factory - Creates providers from method definitions\n * \n * Eliminates boilerplate by auto-generating Provider/Sandbox classes\n * from simple method definitions with automatic feature detection.\n */\n\n// Import all types from local types\nimport type {\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n SandboxFileSystem,\n Provider,\n ProviderSandboxManager,\n ProviderTemplateManager,\n ProviderSnapshotManager,\n ProviderSandbox,\n SandboxInfo,\n CodeResult,\n CommandResult,\n CreateSnapshotOptions,\n ListSnapshotsOptions,\n CreateTemplateOptions,\n ListTemplatesOptions,\n FindOrCreateSandboxOptions,\n FindSandboxOptions,\n ExtendTimeoutOptions,\n} from './types/index.js';\n\n/**\n * Flat sandbox method implementations - all operations in one place\n */\nexport interface SandboxMethods<TSandbox = any, TConfig = any> {\n // Collection operations (map to compute.sandbox.*)\n create: (config: TConfig, options?: CreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n getById: (config: TConfig, sandboxId: string) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n list: (config: TConfig) => Promise<Array<{ sandbox: TSandbox; sandboxId: string }>>;\n destroy: (config: TConfig, sandboxId: string) => Promise<void>;\n\n // Optional named sandbox operations\n findOrCreate?: (config: TConfig, options: FindOrCreateSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string }>;\n find?: (config: TConfig, options: FindSandboxOptions) => Promise<{ sandbox: TSandbox; sandboxId: string } | null>;\n \n // Optional timeout management\n extendTimeout?: (config: TConfig, sandboxId: string, options?: ExtendTimeoutOptions) => Promise<void>;\n\n // Instance operations\n runCode: (sandbox: TSandbox, code: string, runtime?: Runtime, config?: TConfig) => Promise<CodeResult>;\n runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>;\n getInfo: (sandbox: TSandbox) => Promise<SandboxInfo>;\n getUrl: (sandbox: TSandbox, options: { port: number; protocol?: string }) => Promise<string>;\n\n // Optional provider-specific typed getInstance method\n getInstance?: (sandbox: TSandbox) => TSandbox;\n\n // Optional filesystem methods\n filesystem?: {\n readFile: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<string>;\n writeFile: (sandbox: TSandbox, path: string, content: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n mkdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n readdir: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<FileEntry[]>;\n exists: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<boolean>;\n remove: (sandbox: TSandbox, path: string, runCommand: (sandbox: TSandbox, command: string, options?: RunCommandOptions) => Promise<CommandResult>) => Promise<void>;\n };\n}\n\n/**\n * Template method implementations\n */\nexport interface TemplateMethods<TTemplate = any, TConfig = any, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> {\n create: (config: TConfig, options: TCreateOptions) => Promise<TTemplate>;\n list: (config: TConfig, options?: ListTemplatesOptions) => Promise<TTemplate[]>;\n delete: (config: TConfig, templateId: string) => Promise<void>;\n}\n\n/**\n * Snapshot method implementations \n */\nexport interface SnapshotMethods<TSnapshot = any, TConfig = any> {\n create: (config: TConfig, sandboxId: string, options?: CreateSnapshotOptions) => Promise<TSnapshot>;\n list: (config: TConfig, options?: ListSnapshotsOptions) => Promise<TSnapshot[]>;\n delete: (config: TConfig, snapshotId: string) => Promise<void>;\n}\n\n/**\n * Provider configuration for defineProvider()\n */\nexport interface ProviderConfig<TSandbox = any, TConfig = any, TTemplate = any, TSnapshot = any> {\n name: string;\n methods: {\n sandbox: SandboxMethods<TSandbox, TConfig>;\n template?: TemplateMethods<TTemplate, TConfig>;\n snapshot?: SnapshotMethods<TSnapshot, TConfig>;\n };\n}\n\n/**\n * Auto-generated filesystem implementation that throws \"not supported\" errors\n */\nclass UnsupportedFileSystem implements SandboxFileSystem {\n private readonly providerName: string;\n\n constructor(providerName: string) {\n this.providerName = providerName;\n }\n\n async readFile(_path: string): Promise<string> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async writeFile(_path: string, _content: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async mkdir(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async readdir(_path: string): Promise<FileEntry[]> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async exists(_path: string): Promise<boolean> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n\n async remove(_path: string): Promise<void> {\n throw new Error(`Filesystem operations are not supported by ${this.providerName}'s sandbox environment. ${this.providerName} sandboxes are designed for code execution only.`);\n }\n}\n\n\n\n/**\n * Auto-generated filesystem implementation that wraps provider methods\n */\nclass SupportedFileSystem<TSandbox> implements SandboxFileSystem {\n constructor(\n private sandbox: TSandbox,\n private methods: NonNullable<SandboxMethods<TSandbox>['filesystem']>,\n private allMethods: SandboxMethods<TSandbox>\n ) {}\n\n async readFile(path: string): Promise<string> {\n return this.methods.readFile(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n return this.methods.writeFile(this.sandbox, path, content, this.allMethods.runCommand);\n }\n\n async mkdir(path: string): Promise<void> {\n return this.methods.mkdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async readdir(path: string): Promise<FileEntry[]> {\n return this.methods.readdir(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.methods.exists(this.sandbox, path, this.allMethods.runCommand);\n }\n\n async remove(path: string): Promise<void> {\n return this.methods.remove(this.sandbox, path, this.allMethods.runCommand);\n }\n}\n\n\n\n\n\n/**\n * Generated sandbox class - implements the ProviderSandbox interface\n */\nclass GeneratedSandbox<TSandbox = any> implements ProviderSandbox<TSandbox> {\n readonly sandboxId: string;\n readonly provider: string;\n readonly filesystem: SandboxFileSystem;\n\n constructor(\n private sandbox: TSandbox,\n sandboxId: string,\n providerName: string,\n private methods: SandboxMethods<TSandbox>,\n private config: any,\n private destroyMethod: (config: any, sandboxId: string) => Promise<void>,\n private providerInstance: Provider\n ) {\n this.sandboxId = sandboxId;\n this.provider = providerName;\n\n // Auto-detect filesystem support\n if (methods.filesystem) {\n this.filesystem = new SupportedFileSystem(sandbox, methods.filesystem, methods);\n } else {\n this.filesystem = new UnsupportedFileSystem(providerName);\n }\n }\n\n getInstance(): TSandbox {\n // Use provider-specific typed getInstance if available\n if (this.methods.getInstance) {\n return this.methods.getInstance(this.sandbox);\n }\n // Fallback to returning the sandbox directly\n return this.sandbox;\n }\n\n async runCode(code: string, runtime?: Runtime): Promise<CodeResult> {\n return await this.methods.runCode(this.sandbox, code, runtime, this.config);\n }\n\n async runCommand(\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> {\n // Pass command and options directly to provider - no preprocessing\n // Provider is responsible for handling cwd, env, background, etc.\n return await this.methods.runCommand(this.sandbox, command, options);\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.methods.getInfo(this.sandbox);\n }\n\n async getUrl(options: { port: number; protocol?: string }): Promise<string> {\n return await this.methods.getUrl(this.sandbox, options);\n }\n\n getProvider(): Provider<TSandbox> {\n return this.providerInstance;\n }\n\n async destroy(): Promise<void> {\n // Destroy via the provider's destroy method using our sandboxId\n await this.destroyMethod(this.config, this.sandboxId);\n }\n}\n\n/**\n * Auto-generated Sandbox Manager implementation\n */\nclass GeneratedSandboxManager<TSandbox, TConfig> implements ProviderSandboxManager<TSandbox> {\n constructor(\n private config: TConfig,\n private providerName: string,\n private methods: SandboxMethods<TSandbox, TConfig>,\n private providerInstance: Provider\n ) {}\n\n async create(options?: CreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n // Default to 'node' runtime if not specified for consistency across providers\n const optionsWithDefaults = { runtime: 'node' as Runtime, ...options };\n const result = await this.methods.create(this.config, optionsWithDefaults);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async getById(sandboxId: string): Promise<ProviderSandbox<TSandbox> | null> {\n const result = await this.methods.getById(this.config, sandboxId);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async list(): Promise<ProviderSandbox<TSandbox>[]> {\n const results = await this.methods.list(this.config);\n \n return results.map(result => new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n ));\n }\n\n async destroy(sandboxId: string): Promise<void> {\n await this.methods.destroy(this.config, sandboxId);\n }\n\n async findOrCreate(options: FindOrCreateSandboxOptions): Promise<ProviderSandbox<TSandbox>> {\n if (!this.methods.findOrCreate) {\n throw new Error(\n `Provider '${this.providerName}' does not support findOrCreate.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.findOrCreate(this.config, options);\n \n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async find(options: FindSandboxOptions): Promise<ProviderSandbox<TSandbox> | null> {\n if (!this.methods.find) {\n throw new Error(\n `Provider '${this.providerName}' does not support find.\\n` +\n `This feature requires gateway provider with named sandbox support.`\n );\n }\n\n const result = await this.methods.find(this.config, options);\n if (!result) {\n return null;\n }\n\n return new GeneratedSandbox<TSandbox>(\n result.sandbox,\n result.sandboxId,\n this.providerName,\n this.methods,\n this.config,\n this.methods.destroy,\n this.providerInstance\n );\n }\n\n async extendTimeout(sandboxId: string, options?: ExtendTimeoutOptions): Promise<void> {\n if (!this.methods.extendTimeout) {\n throw new Error(\n `Provider '${this.providerName}' does not support extendTimeout.\\n` +\n `This feature requires gateway provider with timeout extension support.`\n );\n }\n\n await this.methods.extendTimeout(this.config, sandboxId, options);\n }\n}\n\n/**\n * Auto-generated Template Manager implementation\n */\nclass GeneratedTemplateManager<TTemplate, TConfig, TCreateOptions extends CreateTemplateOptions = CreateTemplateOptions> implements ProviderTemplateManager<TTemplate, TCreateOptions> {\n constructor(\n private config: TConfig,\n private methods: TemplateMethods<TTemplate, TConfig, TCreateOptions>\n ) {}\n\n async create(options: TCreateOptions): Promise<TTemplate> {\n return await this.methods.create(this.config, options);\n }\n\n async list(options?: ListTemplatesOptions): Promise<TTemplate[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(templateId: string): Promise<void> {\n return await this.methods.delete(this.config, templateId);\n }\n}\n\n/**\n * Auto-generated Snapshot Manager implementation\n */\nclass GeneratedSnapshotManager<TSnapshot, TConfig> implements ProviderSnapshotManager<TSnapshot> {\n constructor(\n private config: TConfig,\n private methods: SnapshotMethods<TSnapshot, TConfig>\n ) {}\n\n async create(sandboxId: string, options?: CreateSnapshotOptions): Promise<TSnapshot> {\n return await this.methods.create(this.config, sandboxId, options);\n }\n\n async list(options?: ListSnapshotsOptions): Promise<TSnapshot[]> {\n return await this.methods.list(this.config, options);\n }\n\n async delete(snapshotId: string): Promise<void> {\n return await this.methods.delete(this.config, snapshotId);\n }\n}\n\n/**\n * Auto-generated Provider implementation\n */\nclass GeneratedProvider<TSandbox, TConfig, TTemplate, TSnapshot> implements Provider<TSandbox, TTemplate, TSnapshot> {\n readonly name: string;\n readonly sandbox: ProviderSandboxManager<TSandbox>;\n readonly template?: ProviderTemplateManager<TTemplate>;\n readonly snapshot?: ProviderSnapshotManager<TSnapshot>;\n\n constructor(config: TConfig, providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>) {\n this.name = providerConfig.name;\n this.sandbox = new GeneratedSandboxManager(\n config,\n providerConfig.name,\n providerConfig.methods.sandbox,\n this\n );\n\n // Initialize optional managers if methods are provided\n if (providerConfig.methods.template) {\n this.template = new GeneratedTemplateManager(config, providerConfig.methods.template);\n }\n \n if (providerConfig.methods.snapshot) {\n this.snapshot = new GeneratedSnapshotManager(config, providerConfig.methods.snapshot);\n }\n }\n\n getSupportedRuntimes(): Runtime[] {\n // For now, all providers support both node and python\n // In the future, this could be configurable per provider\n return ['node', 'python'];\n }\n}\n\n/**\n * Create a provider from method definitions\n *\n * Auto-generates all boilerplate classes and provides feature detection\n * based on which methods are implemented.\n */\nexport function defineProvider<TSandbox, TConfig = any, TTemplate = any, TSnapshot = any>(\n providerConfig: ProviderConfig<TSandbox, TConfig, TTemplate, TSnapshot>\n): (config: TConfig) => Provider<TSandbox, TTemplate, TSnapshot> {\n return (config: TConfig) => {\n return new GeneratedProvider(config, providerConfig);\n };\n}","/**\n * Infrastructure Provider Factory\n * \n * Creates infrastructure-only providers that provision compute resources\n * but don't have native sandbox capabilities. Used by gateway server.\n */\n\nimport type { CreateSandboxOptions } from './types/index.js';\n\n/**\n * Infrastructure provider methods - only resource provisioning\n */\nexport interface InfraProviderMethods<TInstance = any, TConfig = any> {\n /** Create a new compute instance */\n create: (config: TConfig, options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n \n /** Get an existing instance by ID */\n getById: (config: TConfig, instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n \n /** List all instances */\n list: (config: TConfig) => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n \n /** Destroy an instance */\n destroy: (config: TConfig, instanceId: string) => Promise<void>;\n}\n\n/**\n * Daemon configuration passed to infrastructure providers\n */\nexport interface DaemonConfig {\n /** Access token for daemon authentication */\n accessToken: string;\n /** Gateway URL for daemon to connect to */\n gatewayUrl?: string;\n /** Additional daemon environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Infrastructure provider configuration\n */\nexport interface InfraProviderConfig<TInstance = any, TConfig = any> {\n name: string;\n methods: InfraProviderMethods<TInstance, TConfig>;\n}\n\n/**\n * Infrastructure provider interface returned by defineInfraProvider\n */\nexport interface InfraProvider<TInstance = any> {\n name: string;\n create: (options?: CreateSandboxOptions & { daemonConfig?: DaemonConfig }) => Promise<{ instance: TInstance; instanceId: string }>;\n getById: (instanceId: string) => Promise<{ instance: TInstance; instanceId: string } | null>;\n list: () => Promise<Array<{ instance: TInstance; instanceId: string }>>;\n destroy: (instanceId: string) => Promise<void>;\n}\n\n/**\n * Create an infrastructure provider from method definitions\n * \n * Infrastructure providers only handle resource provisioning.\n * The gateway server uses these to create VMs/containers with the ComputeSDK daemon pre-installed.\n * \n * @example\n * ```typescript\n * export const railway = defineInfraProvider<RailwayInstance, RailwayConfig>({\n * name: 'railway',\n * methods: {\n * create: async (config, options) => {\n * // Create Railway service with daemon docker image\n * const service = await railwayAPI.createService({\n * ...config,\n * image: 'computesdk/daemon:latest',\n * env: options?.daemonConfig ? {\n * COMPUTESDK_ACCESS_TOKEN: options.daemonConfig.accessToken,\n * COMPUTESDK_GATEWAY_URL: options.daemonConfig.gatewayUrl,\n * } : {}\n * });\n * return { instance: service, instanceId: service.id };\n * },\n * destroy: async (config, instanceId) => {\n * await railwayAPI.deleteService(config, instanceId);\n * },\n * getById: async (config, instanceId) => {\n * const service = await railwayAPI.getService(config, instanceId);\n * return service ? { instance: service, instanceId: service.id } : null;\n * },\n * list: async (config) => {\n * const services = await railwayAPI.listServices(config);\n * return services.map(s => ({ instance: s, instanceId: s.id }));\n * }\n * }\n * });\n * \n * // Gateway server usage:\n * const provider = railway({ apiKey, projectId, environmentId });\n * const { instance, instanceId } = await provider.create({\n * daemonConfig: { accessToken: 'token_xxx' }\n * });\n * ```\n */\nexport function defineInfraProvider<TInstance, TConfig = any>(\n config: InfraProviderConfig<TInstance, TConfig>\n): (providerConfig: TConfig) => InfraProvider<TInstance> {\n return (providerConfig: TConfig) => {\n return {\n name: config.name,\n \n create: async (options) => {\n return await config.methods.create(providerConfig, options);\n },\n \n getById: async (instanceId) => {\n return await config.methods.getById(providerConfig, instanceId);\n },\n \n list: async () => {\n return await config.methods.list(providerConfig);\n },\n \n destroy: async (instanceId) => {\n await config.methods.destroy(providerConfig, instanceId);\n }\n };\n };\n}\n","/**\n * Compute Factory\n *\n * Creates compute instance factories for infrastructure providers.\n * Allows providers like Railway to feel like first-class citizens while\n * routing through the gateway.\n */\n\nimport { compute, type CallableCompute, type ExplicitComputeConfig, type ProviderName } from 'computesdk';\n\n/**\n * Compute factory configuration\n */\nexport interface ComputeFactoryConfig {\n /** Provider name (must match gateway provider name) */\n provider: ProviderName;\n}\n\n/**\n * Base config for compute factories.\n * Omits 'provider' since that's set by the factory, not the user.\n */\nexport type ComputeConfig = Omit<ExplicitComputeConfig, 'provider'>;\n\n/**\n * Create a compute instance factory for infrastructure providers\n *\n * This allows infrastructure providers like Railway to have their own\n * packages while routing through the gateway. Returns a function that\n * creates pre-configured compute instances.\n *\n * **Note:** This configures the global `compute` singleton. The returned\n * instance shares global state - calling this multiple times with different\n * configs will override previous configurations. This is intentional as\n * the compute singleton is designed to be configured once per application.\n *\n * @example\n * ```typescript\n * // Define Railway compute factory\n * export const railway = defineCompute<RailwayConfig>({\n * provider: 'railway'\n * });\n *\n * // User code:\n * import { railway } from '@computesdk/railway';\n *\n * const compute = railway({\n * apiKey: 'railway_xxx',\n * projectId: 'project_xxx',\n * environmentId: 'env_xxx'\n * });\n *\n * // Full compute API available\n * const sandbox = await compute.sandbox.create();\n * await sandbox.runCode('console.log(\"hello\")');\n * ```\n */\nexport function defineCompute<TConfig extends ComputeConfig>(\n factoryConfig: ComputeFactoryConfig\n): (config: TConfig) => CallableCompute {\n return (config: TConfig) => {\n compute.setConfig({\n ...config,\n provider: factoryConfig.provider,\n });\n return compute;\n };\n}\n","/**\n * Direct Mode Compute API\n * \n * Use this when you want to use providers directly without the gateway.\n * This is the \"mother\" talking directly to \"children\" providers.\n */\n\nimport type { Provider } from './types';\n\n/**\n * Configuration for creating a compute instance with a provider\n */\nexport interface CreateComputeConfig<TInstance = any> {\n /** The provider instance to use */\n defaultProvider?: Provider<TInstance>;\n /** Legacy alias for defaultProvider */\n provider?: Provider<TInstance>;\n}\n\n/**\n * Compute API for direct provider usage\n */\nexport interface ComputeAPI<TInstance = any> {\n /** Sandbox management methods */\n sandbox: Provider<TInstance>['sandbox'];\n /** Get current configuration */\n getConfig(): CreateComputeConfig<TInstance> | null;\n /** Update configuration and return new compute instance */\n setConfig<TNewInstance = any>(config: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance>;\n /** Clear configuration */\n clearConfig(): void;\n}\n\n/**\n * Create a compute instance with a provider for direct mode\n * \n * @example\n * ```typescript\n * import { createCompute } from '@computesdk/provider';\n * import { e2bProvider } from '@computesdk/e2b';\n * \n * const provider = e2bProvider({ apiKey: 'your-key' });\n * const compute = createCompute({ defaultProvider: provider });\n * \n * const sandbox = await compute.sandbox.create();\n * ```\n */\nexport function createCompute<TInstance = any>(\n config: CreateComputeConfig<TInstance>\n): ComputeAPI<TInstance> {\n const provider = config.defaultProvider || config.provider;\n \n if (!provider) {\n throw new Error(\n 'createCompute requires a provider for direct mode. ' +\n 'Pass a provider via the defaultProvider or provider config property. ' +\n 'For gateway mode, do not use createCompute; use the compute singleton from computesdk instead.'\n );\n }\n\n let currentConfig: CreateComputeConfig<TInstance> | null = config;\n\n return {\n sandbox: provider.sandbox,\n \n getConfig() {\n return currentConfig;\n },\n \n setConfig<TNewInstance = any>(newConfig: CreateComputeConfig<TNewInstance>): ComputeAPI<TNewInstance> {\n return createCompute(newConfig);\n },\n \n clearConfig() {\n currentConfig = null;\n }\n };\n}\n","/**\n * Utility functions for ComputeSDK\n */\n\n/**\n * Calculate exponential backoff delay with jitter\n * \n * Uses exponential backoff (2^attempt) multiplied by base delay,\n * plus random jitter to prevent thundering herd.\n * \n * @param attempt - Current retry attempt (0-indexed)\n * @param baseDelay - Base delay in milliseconds (default: 1000)\n * @param jitterMax - Maximum random jitter in milliseconds (default: 100)\n * @returns Delay in milliseconds\n * \n * @example\n * ```typescript\n * // First retry: 1000-1100ms\n * calculateBackoff(0);\n * \n * // Second retry: 2000-2100ms\n * calculateBackoff(1);\n * \n * // Third retry: 4000-4100ms\n * calculateBackoff(2);\n * ```\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n jitterMax: number = 100\n): number {\n return baseDelay * Math.pow(2, attempt) + Math.random() * jitterMax;\n}\n\n/**\n * Escapes a string for safe use in shell commands\n * \n * Escapes special shell characters to prevent command injection.\n * Use this when interpolating user-controlled values into shell commands.\n * \n * @param arg - The string to escape\n * @returns Escaped string safe for shell interpolation\n * \n * @example\n * ```typescript\n * const path = '/path/with spaces';\n * const command = `cd \"${escapeShellArg(path)}\" && ls`;\n * // Result: cd \"/path/with\\ spaces\" && ls\n * \n * const env = { KEY: 'value with $pecial chars' };\n * const command = `KEY=\"${escapeShellArg(env.KEY)}\" npm run build`;\n * // Result: KEY=\"value with \\$pecial chars\" npm run build\n * ```\n */\nexport function escapeShellArg(arg: string): string {\n return arg\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n .replace(/\\$/g, '\\\\$') // Escape dollar signs (variable expansion)\n .replace(/`/g, '\\\\`'); // Escape backticks (command substitution)\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/provider",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Provider framework for ComputeSDK - define custom sandbox providers",
5
5
  "author": "Garrison",
6
6
  "license": "MIT",
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@computesdk/cmd": "0.4.1",
39
- "computesdk": "1.12.0"
39
+ "computesdk": "1.12.1"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^20.0.0",