@cloudflare/sandbox 0.13.0-next.649.1 → 0.13.0-next.681.1
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/Dockerfile +6 -11
- package/README.md +2 -2
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +68 -49
- package/dist/bridge/index.js.map +1 -1
- package/dist/codes-y-U76vnQ.d.ts +79 -0
- package/dist/codes-y-U76vnQ.d.ts.map +1 -0
- package/dist/contexts-DY1LHU1v.d.ts +327 -0
- package/dist/contexts-DY1LHU1v.d.ts.map +1 -0
- package/dist/{dist-mAH_7Ui7.js → dist-BStBkGIC.js} +50 -93
- package/dist/dist-BStBkGIC.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors-ewgSNicb.js +741 -0
- package/dist/errors-ewgSNicb.js.map +1 -0
- package/dist/{errors-CpoDEfUZ.js → errors-k3B8orjH.js} +41 -4
- package/dist/errors-k3B8orjH.js.map +1 -0
- package/dist/extensions/index.d.ts +2 -0
- package/dist/extensions/index.js +4 -0
- package/dist/extensions-CepYdzro.js +191 -0
- package/dist/extensions-CepYdzro.js.map +1 -0
- package/dist/git/index.d.ts +74 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +345 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index-B7QgIs0N.d.ts +1841 -0
- package/dist/index-B7QgIs0N.d.ts.map +1 -0
- package/dist/index-Dy6u9r60.d.ts +390 -0
- package/dist/index-Dy6u9r60.d.ts.map +1 -0
- package/dist/index.d.ts +27 -189
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -43
- package/dist/index.js.map +1 -1
- package/dist/interpreter/index.d.ts +309 -0
- package/dist/interpreter/index.d.ts.map +1 -0
- package/dist/interpreter/index.js +264 -0
- package/dist/interpreter/index.js.map +1 -0
- package/dist/openai/index.d.ts +3 -2
- package/dist/openai/index.d.ts.map +1 -1
- package/dist/openai/index.js +2 -2
- package/dist/openai/index.js.map +1 -1
- package/dist/opencode/index.d.ts +137 -160
- package/dist/opencode/index.d.ts.map +1 -1
- package/dist/opencode/index.js +269 -159
- package/dist/opencode/index.js.map +1 -1
- package/dist/sandbox-DHNO89IF.d.ts +828 -0
- package/dist/sandbox-DHNO89IF.d.ts.map +1 -0
- package/dist/{sandbox-B-FLGbkP.js → sandbox-boKWPIcd.js} +8214 -7267
- package/dist/sandbox-boKWPIcd.js.map +1 -0
- package/dist/sidecar/index.d.ts +77 -0
- package/dist/sidecar/index.d.ts.map +1 -0
- package/dist/sidecar/index.js +201 -0
- package/dist/sidecar/index.js.map +1 -0
- package/dist/xterm/index.d.ts +6 -6
- package/dist/xterm/index.d.ts.map +1 -1
- package/dist/xterm/index.js +6 -6
- package/dist/xterm/index.js.map +1 -1
- package/package.json +36 -3
- package/dist/contexts-DPFhc2nR.d.ts +0 -238
- package/dist/contexts-DPFhc2nR.d.ts.map +0 -1
- package/dist/dist-mAH_7Ui7.js.map +0 -1
- package/dist/errors-CpoDEfUZ.js.map +0 -1
- package/dist/sandbox-44kEJjAc.d.ts +0 -2652
- package/dist/sandbox-44kEJjAc.d.ts.map +0 -1
- package/dist/sandbox-B-FLGbkP.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-ewgSNicb.js","names":["errorResponse: ErrorResponse<TContext>"],"sources":["../src/errors/classes.ts","../src/errors/adapter.ts"],"sourcesContent":["/**\n * Type-safe error classes that wrap ErrorResponse from container\n *\n * All error classes extend SandboxError<TContext> which wraps the full ErrorResponse\n * and provides type-safe accessors for error properties.\n */\n\nimport type {\n BackupCreateContext,\n BackupExpiredContext,\n BackupNotFoundContext,\n BackupRestoreContext,\n CodeExecutionContext,\n CommandErrorContext,\n CommandNotFoundContext,\n ContainerUnavailableContext,\n ContextNotFoundContext,\n ErrorResponse,\n FileExistsContext,\n FileNotFoundContext,\n FileSystemContext,\n FileTooLargeContext,\n GitAuthFailedContext,\n GitBranchNotFoundContext,\n GitErrorContext,\n GitRepositoryNotFoundContext,\n InternalErrorContext,\n InterpreterNotReadyContext,\n InvalidBackupConfigContext,\n InvalidPortContext,\n OperationInterruptedContext,\n PortAlreadyExposedContext,\n PortErrorContext,\n PortNotExposedContext,\n ProcessErrorContext,\n ProcessExitedBeforeReadyContext,\n ProcessNotFoundContext,\n ProcessReadyTimeoutContext,\n RPCTransportContext,\n RPCTransportErrorKind,\n SessionAlreadyExistsContext,\n SessionDestroyedContext,\n SessionTerminatedContext,\n ValidationFailedContext\n} from '@repo/shared/errors';\n\n/**\n * Base SDK error that wraps ErrorResponse\n * Preserves all error information from container\n */\nexport class SandboxError<TContext = Record<string, unknown>> extends Error {\n constructor(\n public readonly errorResponse: ErrorResponse<TContext>,\n options?: { cause?: unknown }\n ) {\n // Forward `cause` through the standard ES2022 Error options bag so\n // `error.cause` is set natively for in-memory inspection (debugger,\n // util.inspect, manual `.cause` walks). It is intentionally omitted\n // from toJSON() — Error instances are not JSON-serializable (their\n // own properties are non-enumerable), so emitting `cause: <Error>`\n // would log `cause: {}` and mislead operators.\n super(errorResponse.message, options);\n this.name = 'SandboxError';\n }\n\n // Convenience accessors\n get code() {\n return this.errorResponse.code;\n }\n get context() {\n return this.errorResponse.context;\n }\n get httpStatus() {\n return this.errorResponse.httpStatus;\n }\n get operation() {\n return this.errorResponse.operation;\n }\n get suggestion() {\n return this.errorResponse.suggestion;\n }\n get timestamp() {\n return this.errorResponse.timestamp;\n }\n get documentation() {\n return this.errorResponse.documentation;\n }\n\n // Custom serialization for logging\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n context: this.context,\n httpStatus: this.httpStatus,\n operation: this.operation,\n suggestion: this.suggestion,\n timestamp: this.timestamp,\n documentation: this.documentation,\n stack: this.stack\n };\n }\n}\n\n// ============================================================================\n// File System Errors\n// ============================================================================\n\n/**\n * Error thrown when a file or directory is not found\n */\nexport class FileNotFoundError extends SandboxError<FileNotFoundContext> {\n constructor(errorResponse: ErrorResponse<FileNotFoundContext>) {\n super(errorResponse);\n this.name = 'FileNotFoundError';\n }\n\n // Type-safe accessors\n get path() {\n return this.context.path;\n }\n}\n\n/**\n * Error thrown when a file already exists\n */\nexport class FileExistsError extends SandboxError<FileExistsContext> {\n constructor(errorResponse: ErrorResponse<FileExistsContext>) {\n super(errorResponse);\n this.name = 'FileExistsError';\n }\n\n // Type-safe accessor\n get path() {\n return this.context.path;\n }\n}\n\n/**\n * Error thrown when a file is too large\n */\nexport class FileTooLargeError extends SandboxError<FileTooLargeContext> {\n constructor(errorResponse: ErrorResponse<FileTooLargeContext>) {\n super(errorResponse);\n this.name = 'FileTooLargeError';\n }\n\n // Type-safe accessor\n get path() {\n return this.context.path;\n }\n}\n\n/**\n * Generic file system error (permissions, disk full, etc.)\n */\nexport class FileSystemError extends SandboxError<FileSystemContext> {\n constructor(errorResponse: ErrorResponse<FileSystemContext>) {\n super(errorResponse);\n this.name = 'FileSystemError';\n }\n\n // Type-safe accessors\n get path() {\n return this.context.path;\n }\n get stderr() {\n return this.context.stderr;\n }\n get exitCode() {\n return this.context.exitCode;\n }\n}\n\n/**\n * Error thrown when permission is denied\n */\nexport class PermissionDeniedError extends SandboxError<FileSystemContext> {\n constructor(errorResponse: ErrorResponse<FileSystemContext>) {\n super(errorResponse);\n this.name = 'PermissionDeniedError';\n }\n\n get path() {\n return this.context.path;\n }\n}\n\n// ============================================================================\n// Command Errors\n// ============================================================================\n\n/**\n * Error thrown when a command is not found\n */\nexport class CommandNotFoundError extends SandboxError<CommandNotFoundContext> {\n constructor(errorResponse: ErrorResponse<CommandNotFoundContext>) {\n super(errorResponse);\n this.name = 'CommandNotFoundError';\n }\n\n // Type-safe accessor\n get command() {\n return this.context.command;\n }\n}\n\n/**\n * Generic command execution error\n */\nexport class CommandError extends SandboxError<CommandErrorContext> {\n constructor(errorResponse: ErrorResponse<CommandErrorContext>) {\n super(errorResponse);\n this.name = 'CommandError';\n }\n\n // Type-safe accessors\n get command() {\n return this.context.command;\n }\n get exitCode() {\n return this.context.exitCode;\n }\n get stdout() {\n return this.context.stdout;\n }\n get stderr() {\n return this.context.stderr;\n }\n}\n\n// ============================================================================\n// Process Errors\n// ============================================================================\n\n/**\n * Error thrown when a process is not found\n */\nexport class ProcessNotFoundError extends SandboxError<ProcessNotFoundContext> {\n constructor(errorResponse: ErrorResponse<ProcessNotFoundContext>) {\n super(errorResponse);\n this.name = 'ProcessNotFoundError';\n }\n\n // Type-safe accessor\n get processId() {\n return this.context.processId;\n }\n}\n\n/**\n * Generic process error\n */\nexport class ProcessError extends SandboxError<ProcessErrorContext> {\n constructor(errorResponse: ErrorResponse<ProcessErrorContext>) {\n super(errorResponse);\n this.name = 'ProcessError';\n }\n\n // Type-safe accessors\n get processId() {\n return this.context.processId;\n }\n get pid() {\n return this.context.pid;\n }\n get exitCode() {\n return this.context.exitCode;\n }\n get stderr() {\n return this.context.stderr;\n }\n}\n\n// ============================================================================\n// Session Errors\n// ============================================================================\n\n/**\n * Error thrown when a session already exists\n */\nexport class SessionAlreadyExistsError extends SandboxError<SessionAlreadyExistsContext> {\n constructor(errorResponse: ErrorResponse<SessionAlreadyExistsContext>) {\n super(errorResponse);\n this.name = 'SessionAlreadyExistsError';\n }\n\n // Type-safe accessors\n get sessionId() {\n return this.context.sessionId;\n }\n\n get containerPlacementId(): string | null | undefined {\n return this.context.containerPlacementId;\n }\n}\n\n/**\n * Error thrown when a session was destroyed while a command was executing\n */\nexport class SessionDestroyedError extends SandboxError<SessionDestroyedContext> {\n constructor(errorResponse: ErrorResponse<SessionDestroyedContext>) {\n super(errorResponse);\n this.name = 'SessionDestroyedError';\n }\n\n // Type-safe accessor\n get sessionId() {\n return this.context.sessionId;\n }\n}\n\n/**\n * Error thrown when a session's underlying shell exited without an explicit\n * `destroy()` call (user ran `exit`, the shell crashed, or a child process\n * took the shell down). The session-local state is gone, but the next call\n * with the same sessionId will transparently start a fresh session.\n */\nexport class SessionTerminatedError extends SandboxError<SessionTerminatedContext> {\n constructor(errorResponse: ErrorResponse<SessionTerminatedContext>) {\n super(errorResponse);\n this.name = 'SessionTerminatedError';\n }\n\n get sessionId() {\n return this.context.sessionId;\n }\n\n get exitCode() {\n return this.context.exitCode;\n }\n}\n\n// ============================================================================\n// Port Errors\n// ============================================================================\n\n/**\n * Compatibility error for legacy port exposure registry responses.\n */\nexport class PortAlreadyExposedError extends SandboxError<PortAlreadyExposedContext> {\n constructor(errorResponse: ErrorResponse<PortAlreadyExposedContext>) {\n super(errorResponse);\n this.name = 'PortAlreadyExposedError';\n }\n\n // Type-safe accessors\n get port() {\n return this.context.port;\n }\n get portName() {\n return this.context.portName;\n }\n}\n\n/**\n * Compatibility error for legacy port exposure registry responses.\n */\nexport class PortNotExposedError extends SandboxError<PortNotExposedContext> {\n constructor(errorResponse: ErrorResponse<PortNotExposedContext>) {\n super(errorResponse);\n this.name = 'PortNotExposedError';\n }\n\n // Type-safe accessor\n get port() {\n return this.context.port;\n }\n}\n\n/**\n * Error thrown when a port number is invalid\n */\nexport class InvalidPortError extends SandboxError<InvalidPortContext> {\n constructor(errorResponse: ErrorResponse<InvalidPortContext>) {\n super(errorResponse);\n this.name = 'InvalidPortError';\n }\n\n // Type-safe accessors\n get port() {\n return this.context.port;\n }\n get reason() {\n return this.context.reason;\n }\n}\n\n/**\n * Error thrown when a service on a port is not responding\n */\nexport class ServiceNotRespondingError extends SandboxError<PortErrorContext> {\n constructor(errorResponse: ErrorResponse<PortErrorContext>) {\n super(errorResponse);\n this.name = 'ServiceNotRespondingError';\n }\n\n // Type-safe accessors\n get port() {\n return this.context.port;\n }\n get portName() {\n return this.context.portName;\n }\n}\n\n/**\n * Error thrown when a port is already in use\n */\nexport class PortInUseError extends SandboxError<PortErrorContext> {\n constructor(errorResponse: ErrorResponse<PortErrorContext>) {\n super(errorResponse);\n this.name = 'PortInUseError';\n }\n\n // Type-safe accessor\n get port() {\n return this.context.port;\n }\n}\n\n/**\n * Generic port operation error\n */\nexport class PortError extends SandboxError<PortErrorContext> {\n constructor(errorResponse: ErrorResponse<PortErrorContext>) {\n super(errorResponse);\n this.name = 'PortError';\n }\n\n // Type-safe accessors\n get port() {\n return this.context.port;\n }\n get portName() {\n return this.context.portName;\n }\n get stderr() {\n return this.context.stderr;\n }\n}\n\n/**\n * Error thrown when port exposure requires a custom domain\n */\nexport class CustomDomainRequiredError extends SandboxError<InternalErrorContext> {\n constructor(errorResponse: ErrorResponse<InternalErrorContext>) {\n super(errorResponse);\n this.name = 'CustomDomainRequiredError';\n }\n}\n\n// ============================================================================\n// Git Errors\n// ============================================================================\n\n/**\n * Error thrown when a git repository is not found\n */\nexport class GitRepositoryNotFoundError extends SandboxError<GitRepositoryNotFoundContext> {\n constructor(errorResponse: ErrorResponse<GitRepositoryNotFoundContext>) {\n super(errorResponse);\n this.name = 'GitRepositoryNotFoundError';\n }\n\n // Type-safe accessor\n get repository() {\n return this.context.repository;\n }\n}\n\n/**\n * Error thrown when git authentication fails\n */\nexport class GitAuthenticationError extends SandboxError<GitAuthFailedContext> {\n constructor(errorResponse: ErrorResponse<GitAuthFailedContext>) {\n super(errorResponse);\n this.name = 'GitAuthenticationError';\n }\n\n // Type-safe accessor\n get repository() {\n return this.context.repository;\n }\n}\n\n/**\n * Error thrown when a git branch is not found\n */\nexport class GitBranchNotFoundError extends SandboxError<GitBranchNotFoundContext> {\n constructor(errorResponse: ErrorResponse<GitBranchNotFoundContext>) {\n super(errorResponse);\n this.name = 'GitBranchNotFoundError';\n }\n\n // Type-safe accessors\n get branch() {\n return this.context.branch;\n }\n get repository() {\n return this.context.repository;\n }\n}\n\n/**\n * Error thrown when a git network operation fails\n */\nexport class GitNetworkError extends SandboxError<GitErrorContext> {\n constructor(errorResponse: ErrorResponse<GitErrorContext>) {\n super(errorResponse);\n this.name = 'GitNetworkError';\n }\n\n // Type-safe accessors\n get repository() {\n return this.context.repository;\n }\n get branch() {\n return this.context.branch;\n }\n get targetDir() {\n return this.context.targetDir;\n }\n}\n\n/**\n * Error thrown when git clone fails\n */\nexport class GitCloneError extends SandboxError<GitErrorContext> {\n constructor(errorResponse: ErrorResponse<GitErrorContext>) {\n super(errorResponse);\n this.name = 'GitCloneError';\n }\n\n // Type-safe accessors\n get repository() {\n return this.context.repository;\n }\n get targetDir() {\n return this.context.targetDir;\n }\n get stderr() {\n return this.context.stderr;\n }\n get exitCode() {\n return this.context.exitCode;\n }\n}\n\n/**\n * Error thrown when git checkout fails\n */\nexport class GitCheckoutError extends SandboxError<GitErrorContext> {\n constructor(errorResponse: ErrorResponse<GitErrorContext>) {\n super(errorResponse);\n this.name = 'GitCheckoutError';\n }\n\n // Type-safe accessors\n get branch() {\n return this.context.branch;\n }\n get repository() {\n return this.context.repository;\n }\n get stderr() {\n return this.context.stderr;\n }\n}\n\n/**\n * Error thrown when a git URL is invalid\n */\nexport class InvalidGitUrlError extends SandboxError<ValidationFailedContext> {\n constructor(errorResponse: ErrorResponse<ValidationFailedContext>) {\n super(errorResponse);\n this.name = 'InvalidGitUrlError';\n }\n\n // Type-safe accessor\n get validationErrors() {\n return this.context.validationErrors;\n }\n}\n\n/**\n * Generic git operation error\n */\nexport class GitError extends SandboxError<GitErrorContext> {\n constructor(errorResponse: ErrorResponse<GitErrorContext>) {\n super(errorResponse);\n this.name = 'GitError';\n }\n\n // Type-safe accessors\n get repository() {\n return this.context.repository;\n }\n get branch() {\n return this.context.branch;\n }\n get targetDir() {\n return this.context.targetDir;\n }\n get stderr() {\n return this.context.stderr;\n }\n get exitCode() {\n return this.context.exitCode;\n }\n}\n\n// ============================================================================\n// Code Interpreter Errors\n// ============================================================================\n\n/**\n * Error thrown when interpreter is not ready\n */\nexport class InterpreterNotReadyError extends SandboxError<InterpreterNotReadyContext> {\n constructor(errorResponse: ErrorResponse<InterpreterNotReadyContext>) {\n super(errorResponse);\n this.name = 'InterpreterNotReadyError';\n }\n\n // Type-safe accessors\n get retryAfter() {\n return this.context.retryAfter;\n }\n get progress() {\n return this.context.progress;\n }\n}\n\n/**\n * Error thrown when a context is not found\n */\nexport class ContextNotFoundError extends SandboxError<ContextNotFoundContext> {\n constructor(errorResponse: ErrorResponse<ContextNotFoundContext>) {\n super(errorResponse);\n this.name = 'ContextNotFoundError';\n }\n\n // Type-safe accessor\n get contextId() {\n return this.context.contextId;\n }\n}\n\n/**\n * Error thrown when code execution fails\n */\nexport class CodeExecutionError extends SandboxError<CodeExecutionContext> {\n constructor(errorResponse: ErrorResponse<CodeExecutionContext>) {\n super(errorResponse);\n this.name = 'CodeExecutionError';\n }\n\n // Type-safe accessors\n get contextId() {\n return this.context.contextId;\n }\n get ename() {\n return this.context.ename;\n }\n get evalue() {\n return this.context.evalue;\n }\n get traceback() {\n return this.context.traceback;\n }\n}\n\n// ============================================================================\n// Validation Errors\n// ============================================================================\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationFailedError extends SandboxError<ValidationFailedContext> {\n constructor(errorResponse: ErrorResponse<ValidationFailedContext>) {\n super(errorResponse);\n this.name = 'ValidationFailedError';\n }\n\n // Type-safe accessor\n get validationErrors() {\n return this.context.validationErrors;\n }\n}\n\n// ============================================================================\n// Process Readiness Errors\n// ============================================================================\n\n/**\n * Error thrown when a process does not become ready within the timeout period\n */\nexport class ProcessReadyTimeoutError extends SandboxError<ProcessReadyTimeoutContext> {\n constructor(errorResponse: ErrorResponse<ProcessReadyTimeoutContext>) {\n super(errorResponse);\n this.name = 'ProcessReadyTimeoutError';\n }\n\n // Type-safe accessors\n get processId() {\n return this.context.processId;\n }\n get command() {\n return this.context.command;\n }\n get condition() {\n return this.context.condition;\n }\n get timeout() {\n return this.context.timeout;\n }\n}\n\n/**\n * Error thrown when a process exits before becoming ready\n */\nexport class ProcessExitedBeforeReadyError extends SandboxError<ProcessExitedBeforeReadyContext> {\n constructor(errorResponse: ErrorResponse<ProcessExitedBeforeReadyContext>) {\n super(errorResponse);\n this.name = 'ProcessExitedBeforeReadyError';\n }\n\n // Type-safe accessors\n get processId() {\n return this.context.processId;\n }\n get command() {\n return this.context.command;\n }\n get condition() {\n return this.context.condition;\n }\n get exitCode() {\n return this.context.exitCode;\n }\n}\n\n// ============================================================================\n// Backup Errors\n// ============================================================================\n\n/**\n * Error thrown when a backup is not found in R2\n */\nexport class BackupNotFoundError extends SandboxError<BackupNotFoundContext> {\n constructor(errorResponse: ErrorResponse<BackupNotFoundContext>) {\n super(errorResponse);\n this.name = 'BackupNotFoundError';\n }\n\n get backupId() {\n return this.context.backupId;\n }\n}\n\n/**\n * Error thrown when a backup has expired (past its TTL)\n */\nexport class BackupExpiredError extends SandboxError<BackupExpiredContext> {\n constructor(errorResponse: ErrorResponse<BackupExpiredContext>) {\n super(errorResponse);\n this.name = 'BackupExpiredError';\n }\n\n get backupId() {\n return this.context.backupId;\n }\n get expiredAt() {\n return this.context.expiredAt;\n }\n}\n\n/**\n * Error thrown when backup configuration or inputs are invalid\n */\nexport class InvalidBackupConfigError extends SandboxError<InvalidBackupConfigContext> {\n constructor(errorResponse: ErrorResponse<InvalidBackupConfigContext>) {\n super(errorResponse);\n this.name = 'InvalidBackupConfigError';\n }\n\n get reason() {\n return this.context.reason;\n }\n}\n\n/**\n * Error thrown when backup creation fails\n */\nexport class BackupCreateError extends SandboxError<BackupCreateContext> {\n constructor(errorResponse: ErrorResponse<BackupCreateContext>) {\n super(errorResponse);\n this.name = 'BackupCreateError';\n }\n\n get dir() {\n return this.context.dir;\n }\n get backupId() {\n return this.context.backupId;\n }\n}\n\n/**\n * Error thrown when backup restoration fails\n */\nexport class BackupRestoreError extends SandboxError<BackupRestoreContext> {\n constructor(errorResponse: ErrorResponse<BackupRestoreContext>) {\n super(errorResponse);\n this.name = 'BackupRestoreError';\n }\n\n get dir() {\n return this.context.dir;\n }\n get backupId() {\n return this.context.backupId;\n }\n}\n\n// ============================================================================\n// Container Availability Errors\n// ============================================================================\n\nexport class ContainerUnavailableError extends SandboxError<ContainerUnavailableContext> {\n constructor(errorResponse: ErrorResponse<ContainerUnavailableContext>) {\n super(errorResponse);\n this.name = 'ContainerUnavailableError';\n }\n}\n\n// ============================================================================\n// Operation Lifecycle Errors\n// ============================================================================\n\nexport class OperationInterruptedError extends SandboxError<OperationInterruptedContext> {\n constructor(errorResponse: ErrorResponse<OperationInterruptedContext>) {\n super(errorResponse);\n this.name = 'OperationInterruptedError';\n }\n\n get reason() {\n return this.context.reason;\n }\n\n get retryable() {\n return this.context.retryable;\n }\n\n get operationName() {\n return this.context.operation;\n }\n}\n\n// ============================================================================\n// RPC Transport Errors (SDK-side)\n// ============================================================================\n\n/**\n * Raised when the capnweb WebSocket session itself fails on the SDK side.\n * Unlike the rest of the SandboxError tree, the container never produces\n * this error — it is synthesised by `translateRPCError` from the plain\n * Errors capnweb / DeferredTransport raise when the connection dies.\n *\n * `kind` distinguishes the failure mode (peer close, upgrade failed, etc.)\n * so callers can branch on a structured code instead of substring-matching\n * on the message.\n *\n * Always retryable: the SDK opens a fresh connection on the next call.\n */\nexport class RPCTransportError extends SandboxError<RPCTransportContext> {\n constructor(\n errorResponse: ErrorResponse<RPCTransportContext>,\n options?: { cause?: unknown }\n ) {\n super(errorResponse, options);\n this.name = 'RPCTransportError';\n }\n\n get kind(): RPCTransportErrorKind {\n return this.errorResponse.context.kind;\n }\n\n get originalMessage(): string {\n return this.errorResponse.context.originalMessage;\n }\n}\n","/**\n * Error adapter that converts ErrorResponse to appropriate Error class\n *\n * Simple switch statement - we trust the container sends correct context\n * No validation overhead since we control both sides\n */\n\nimport type {\n BackupCreateContext,\n BackupExpiredContext,\n BackupNotFoundContext,\n BackupRestoreContext,\n CodeExecutionContext,\n CommandErrorContext,\n CommandNotFoundContext,\n ContainerUnavailableContext,\n ContextNotFoundContext,\n ErrorResponse,\n FileExistsContext,\n FileNotFoundContext,\n FileSystemContext,\n FileTooLargeContext,\n GitAuthFailedContext,\n GitBranchNotFoundContext,\n GitErrorContext,\n GitRepositoryNotFoundContext,\n InternalErrorContext,\n InterpreterNotReadyContext,\n InvalidBackupConfigContext,\n InvalidPortContext,\n OperationInterruptedContext,\n PortAlreadyExposedContext,\n PortErrorContext,\n PortNotExposedContext,\n ProcessErrorContext,\n ProcessNotFoundContext,\n RPCTransportContext,\n SessionAlreadyExistsContext,\n SessionDestroyedContext,\n SessionTerminatedContext,\n ValidationFailedContext\n} from '@repo/shared/errors';\nimport { ErrorCode } from '@repo/shared/errors';\n\nimport {\n BackupCreateError,\n BackupExpiredError,\n BackupNotFoundError,\n BackupRestoreError,\n CodeExecutionError,\n CommandError,\n CommandNotFoundError,\n ContainerUnavailableError,\n ContextNotFoundError,\n CustomDomainRequiredError,\n FileExistsError,\n FileNotFoundError,\n FileSystemError,\n FileTooLargeError,\n GitAuthenticationError,\n GitBranchNotFoundError,\n GitCheckoutError,\n GitCloneError,\n GitError,\n GitNetworkError,\n GitRepositoryNotFoundError,\n InterpreterNotReadyError,\n InvalidBackupConfigError,\n InvalidGitUrlError,\n InvalidPortError,\n OperationInterruptedError,\n PermissionDeniedError,\n PortAlreadyExposedError,\n PortError,\n PortInUseError,\n PortNotExposedError,\n ProcessError,\n ProcessNotFoundError,\n RPCTransportError,\n SandboxError,\n ServiceNotRespondingError,\n SessionAlreadyExistsError,\n SessionDestroyedError,\n SessionTerminatedError,\n ValidationFailedError\n} from './classes';\n\n/**\n * Convert ErrorResponse to appropriate Error class\n * Simple switch statement - we trust the container sends correct context\n */\nexport function createErrorFromResponse(\n errorResponse: ErrorResponse,\n options?: { cause?: unknown }\n): Error {\n // We trust the container sends correct context, use type assertions\n switch (errorResponse.code) {\n // File System Errors\n case ErrorCode.FILE_NOT_FOUND:\n return new FileNotFoundError(\n errorResponse as unknown as ErrorResponse<FileNotFoundContext>\n );\n\n case ErrorCode.FILE_EXISTS:\n return new FileExistsError(\n errorResponse as unknown as ErrorResponse<FileExistsContext>\n );\n\n case ErrorCode.FILE_TOO_LARGE:\n return new FileTooLargeError(\n errorResponse as unknown as ErrorResponse<FileTooLargeContext>\n );\n\n case ErrorCode.PERMISSION_DENIED:\n return new PermissionDeniedError(\n errorResponse as unknown as ErrorResponse<FileSystemContext>\n );\n\n case ErrorCode.IS_DIRECTORY:\n case ErrorCode.NOT_DIRECTORY:\n case ErrorCode.NO_SPACE:\n case ErrorCode.TOO_MANY_FILES:\n case ErrorCode.RESOURCE_BUSY:\n case ErrorCode.READ_ONLY:\n case ErrorCode.NAME_TOO_LONG:\n case ErrorCode.TOO_MANY_LINKS:\n case ErrorCode.FILESYSTEM_ERROR:\n return new FileSystemError(\n errorResponse as unknown as ErrorResponse<FileSystemContext>\n );\n\n // Command Errors\n case ErrorCode.COMMAND_NOT_FOUND:\n return new CommandNotFoundError(\n errorResponse as unknown as ErrorResponse<CommandNotFoundContext>\n );\n\n case ErrorCode.COMMAND_PERMISSION_DENIED:\n case ErrorCode.COMMAND_EXECUTION_ERROR:\n case ErrorCode.INVALID_COMMAND:\n case ErrorCode.STREAM_START_ERROR:\n return new CommandError(\n errorResponse as unknown as ErrorResponse<CommandErrorContext>\n );\n\n // Process Errors\n case ErrorCode.PROCESS_NOT_FOUND:\n return new ProcessNotFoundError(\n errorResponse as unknown as ErrorResponse<ProcessNotFoundContext>\n );\n\n case ErrorCode.PROCESS_PERMISSION_DENIED:\n case ErrorCode.PROCESS_ERROR:\n return new ProcessError(\n errorResponse as unknown as ErrorResponse<ProcessErrorContext>\n );\n\n // Session Errors\n case ErrorCode.SESSION_ALREADY_EXISTS:\n return new SessionAlreadyExistsError(\n errorResponse as unknown as ErrorResponse<SessionAlreadyExistsContext>\n );\n\n case ErrorCode.SESSION_DESTROYED:\n return new SessionDestroyedError(\n errorResponse as unknown as ErrorResponse<SessionDestroyedContext>\n );\n\n case ErrorCode.SESSION_TERMINATED:\n return new SessionTerminatedError(\n errorResponse as unknown as ErrorResponse<SessionTerminatedContext>\n );\n\n // Port Errors\n case ErrorCode.PORT_ALREADY_EXPOSED:\n return new PortAlreadyExposedError(\n errorResponse as unknown as ErrorResponse<PortAlreadyExposedContext>\n );\n\n case ErrorCode.PORT_NOT_EXPOSED:\n return new PortNotExposedError(\n errorResponse as unknown as ErrorResponse<PortNotExposedContext>\n );\n\n case ErrorCode.INVALID_PORT_NUMBER:\n case ErrorCode.INVALID_PORT:\n return new InvalidPortError(\n errorResponse as unknown as ErrorResponse<InvalidPortContext>\n );\n\n case ErrorCode.SERVICE_NOT_RESPONDING:\n return new ServiceNotRespondingError(\n errorResponse as unknown as ErrorResponse<PortErrorContext>\n );\n\n case ErrorCode.PORT_IN_USE:\n return new PortInUseError(\n errorResponse as unknown as ErrorResponse<PortErrorContext>\n );\n\n case ErrorCode.PORT_OPERATION_ERROR:\n return new PortError(\n errorResponse as unknown as ErrorResponse<PortErrorContext>\n );\n\n case ErrorCode.CUSTOM_DOMAIN_REQUIRED:\n return new CustomDomainRequiredError(\n errorResponse as unknown as ErrorResponse<InternalErrorContext>\n );\n\n // Git Errors\n case ErrorCode.GIT_REPOSITORY_NOT_FOUND:\n return new GitRepositoryNotFoundError(\n errorResponse as unknown as ErrorResponse<GitRepositoryNotFoundContext>\n );\n\n case ErrorCode.GIT_AUTH_FAILED:\n return new GitAuthenticationError(\n errorResponse as unknown as ErrorResponse<GitAuthFailedContext>\n );\n\n case ErrorCode.GIT_BRANCH_NOT_FOUND:\n return new GitBranchNotFoundError(\n errorResponse as unknown as ErrorResponse<GitBranchNotFoundContext>\n );\n\n case ErrorCode.GIT_NETWORK_ERROR:\n return new GitNetworkError(\n errorResponse as unknown as ErrorResponse<GitErrorContext>\n );\n\n case ErrorCode.GIT_CLONE_FAILED:\n return new GitCloneError(\n errorResponse as unknown as ErrorResponse<GitErrorContext>\n );\n\n case ErrorCode.GIT_CHECKOUT_FAILED:\n return new GitCheckoutError(\n errorResponse as unknown as ErrorResponse<GitErrorContext>\n );\n\n case ErrorCode.INVALID_GIT_URL:\n return new InvalidGitUrlError(\n errorResponse as unknown as ErrorResponse<ValidationFailedContext>\n );\n\n case ErrorCode.GIT_OPERATION_FAILED:\n return new GitError(\n errorResponse as unknown as ErrorResponse<GitErrorContext>\n );\n\n // Backup Errors\n case ErrorCode.BACKUP_NOT_FOUND:\n return new BackupNotFoundError(\n errorResponse as unknown as ErrorResponse<BackupNotFoundContext>\n );\n\n case ErrorCode.BACKUP_EXPIRED:\n return new BackupExpiredError(\n errorResponse as unknown as ErrorResponse<BackupExpiredContext>\n );\n\n case ErrorCode.INVALID_BACKUP_CONFIG:\n return new InvalidBackupConfigError(\n errorResponse as unknown as ErrorResponse<InvalidBackupConfigContext>\n );\n\n case ErrorCode.BACKUP_CREATE_FAILED:\n return new BackupCreateError(\n errorResponse as unknown as ErrorResponse<BackupCreateContext>\n );\n\n case ErrorCode.BACKUP_RESTORE_FAILED:\n return new BackupRestoreError(\n errorResponse as unknown as ErrorResponse<BackupRestoreContext>\n );\n\n // Code Interpreter Errors\n case ErrorCode.INTERPRETER_NOT_READY:\n return new InterpreterNotReadyError(\n errorResponse as unknown as ErrorResponse<InterpreterNotReadyContext>\n );\n\n case ErrorCode.CONTEXT_NOT_FOUND:\n return new ContextNotFoundError(\n errorResponse as unknown as ErrorResponse<ContextNotFoundContext>\n );\n\n case ErrorCode.CODE_EXECUTION_ERROR:\n return new CodeExecutionError(\n errorResponse as unknown as ErrorResponse<CodeExecutionContext>\n );\n\n case ErrorCode.CONTAINER_UNAVAILABLE:\n return new ContainerUnavailableError(\n errorResponse as unknown as ErrorResponse<ContainerUnavailableContext>\n );\n\n case ErrorCode.OPERATION_INTERRUPTED:\n return new OperationInterruptedError(\n errorResponse as unknown as ErrorResponse<OperationInterruptedContext>\n );\n\n // RPC Transport Errors (SDK-side, raised by translateRPCError on\n // capnweb / DeferredTransport WebSocket failures).\n case ErrorCode.RPC_TRANSPORT_ERROR:\n return new RPCTransportError(\n errorResponse as unknown as ErrorResponse<RPCTransportContext>,\n options\n );\n\n // Validation Errors\n case ErrorCode.VALIDATION_FAILED:\n return new ValidationFailedError(\n errorResponse as unknown as ErrorResponse<ValidationFailedContext>\n );\n\n // Generic Errors\n case ErrorCode.INVALID_JSON_RESPONSE:\n case ErrorCode.UNKNOWN_ERROR:\n case ErrorCode.INTERNAL_ERROR:\n return new SandboxError(\n errorResponse as unknown as ErrorResponse<InternalErrorContext>\n );\n\n default:\n // Fallback for unknown error codes\n return new SandboxError(errorResponse);\n }\n}\n"],"mappings":";;;;;;;AAkDA,IAAa,eAAb,cAAsE,MAAM;CAC1E,YACE,AAAgBA,eAChB,SACA;AAOA,QAAM,cAAc,SAAS,QAAQ;EATrB;AAUhB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,cAAc;;CAE5B,IAAI,UAAU;AACZ,SAAO,KAAK,cAAc;;CAE5B,IAAI,aAAa;AACf,SAAO,KAAK,cAAc;;CAE5B,IAAI,YAAY;AACd,SAAO,KAAK,cAAc;;CAE5B,IAAI,aAAa;AACf,SAAO,KAAK,cAAc;;CAE5B,IAAI,YAAY;AACd,SAAO,KAAK,cAAc;;CAE5B,IAAI,gBAAgB;AAClB,SAAO,KAAK,cAAc;;CAI5B,SAAS;AACP,SAAO;GACL,MAAM,KAAK;GACX,SAAS,KAAK;GACd,MAAM,KAAK;GACX,SAAS,KAAK;GACd,YAAY,KAAK;GACjB,WAAW,KAAK;GAChB,YAAY,KAAK;GACjB,WAAW,KAAK;GAChB,eAAe,KAAK;GACpB,OAAO,KAAK;GACb;;;;;;AAWL,IAAa,oBAAb,cAAuC,aAAkC;CACvE,YAAY,eAAmD;AAC7D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,kBAAb,cAAqC,aAAgC;CACnE,YAAY,eAAiD;AAC3D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,oBAAb,cAAuC,aAAkC;CACvE,YAAY,eAAmD;AAC7D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,kBAAb,cAAqC,aAAgC;CACnE,YAAY,eAAiD;AAC3D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,wBAAb,cAA2C,aAAgC;CACzE,YAAY,eAAiD;AAC3D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,uBAAb,cAA0C,aAAqC;CAC7E,YAAY,eAAsD;AAChE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,UAAU;AACZ,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,eAAb,cAAkC,aAAkC;CAClE,YAAY,eAAmD;AAC7D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,UAAU;AACZ,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,uBAAb,cAA0C,aAAqC;CAC7E,YAAY,eAAsD;AAChE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,eAAb,cAAkC,aAAkC;CAClE,YAAY,eAAmD;AAC7D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,MAAM;AACR,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,4BAAb,cAA+C,aAA0C;CACvF,YAAY,eAA2D;AACrE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAGtB,IAAI,uBAAkD;AACpD,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,wBAAb,cAA2C,aAAsC;CAC/E,YAAY,eAAuD;AACjE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;;;;;;;;AAUxB,IAAa,yBAAb,cAA4C,aAAuC;CACjF,YAAY,eAAwD;AAClE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAGtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,0BAAb,cAA6C,aAAwC;CACnF,YAAY,eAAyD;AACnE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,sBAAb,cAAyC,aAAoC;CAC3E,YAAY,eAAqD;AAC/D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,mBAAb,cAAsC,aAAiC;CACrE,YAAY,eAAkD;AAC5D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,4BAAb,cAA+C,aAA+B;CAC5E,YAAY,eAAgD;AAC1D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,iBAAb,cAAoC,aAA+B;CACjE,YAAY,eAAgD;AAC1D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,YAAb,cAA+B,aAA+B;CAC5D,YAAY,eAAgD;AAC1D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,OAAO;AACT,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,4BAAb,cAA+C,aAAmC;CAChF,YAAY,eAAoD;AAC9D,QAAM,cAAc;AACpB,OAAK,OAAO;;;;;;AAWhB,IAAa,6BAAb,cAAgD,aAA2C;CACzF,YAAY,eAA4D;AACtE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,yBAAb,cAA4C,aAAmC;CAC7E,YAAY,eAAoD;AAC9D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,yBAAb,cAA4C,aAAuC;CACjF,YAAY,eAAwD;AAClE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,kBAAb,cAAqC,aAA8B;CACjE,YAAY,eAA+C;AACzD,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,gBAAb,cAAmC,aAA8B;CAC/D,YAAY,eAA+C;AACzD,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,mBAAb,cAAsC,aAA8B;CAClE,YAAY,eAA+C;AACzD,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,qBAAb,cAAwC,aAAsC;CAC5E,YAAY,eAAuD;AACjE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,mBAAmB;AACrB,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,WAAb,cAA8B,aAA8B;CAC1D,YAAY,eAA+C;AACzD,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,2BAAb,cAA8C,aAAyC;CACrF,YAAY,eAA0D;AACpE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,uBAAb,cAA0C,aAAqC;CAC7E,YAAY,eAAsD;AAChE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,qBAAb,cAAwC,aAAmC;CACzE,YAAY,eAAoD;AAC9D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,QAAQ;AACV,SAAO,KAAK,QAAQ;;CAEtB,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,wBAAb,cAA2C,aAAsC;CAC/E,YAAY,eAAuD;AACjE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,mBAAmB;AACrB,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,2BAAb,cAA8C,aAAyC;CACrF,YAAY,eAA0D;AACpE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,UAAU;AACZ,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,UAAU;AACZ,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,gCAAb,cAAmD,aAA8C;CAC/F,YAAY,eAA+D;AACzE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAId,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,UAAU;AACZ,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAWxB,IAAa,sBAAb,cAAyC,aAAoC;CAC3E,YAAY,eAAqD;AAC/D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,qBAAb,cAAwC,aAAmC;CACzE,YAAY,eAAoD;AAC9D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,2BAAb,cAA8C,aAAyC;CACrF,YAAY,eAA0D;AACpE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,oBAAb,cAAuC,aAAkC;CACvE,YAAY,eAAmD;AAC7D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,MAAM;AACR,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;;;;AAOxB,IAAa,qBAAb,cAAwC,aAAmC;CACzE,YAAY,eAAoD;AAC9D,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,MAAM;AACR,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;;AAQxB,IAAa,4BAAb,cAA+C,aAA0C;CACvF,YAAY,eAA2D;AACrE,QAAM,cAAc;AACpB,OAAK,OAAO;;;AAQhB,IAAa,4BAAb,cAA+C,aAA0C;CACvF,YAAY,eAA2D;AACrE,QAAM,cAAc;AACpB,OAAK,OAAO;;CAGd,IAAI,SAAS;AACX,SAAO,KAAK,QAAQ;;CAGtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAGtB,IAAI,gBAAgB;AAClB,SAAO,KAAK,QAAQ;;;;;;;;;;;;;;;AAoBxB,IAAa,oBAAb,cAAuC,aAAkC;CACvE,YACE,eACA,SACA;AACA,QAAM,eAAe,QAAQ;AAC7B,OAAK,OAAO;;CAGd,IAAI,OAA8B;AAChC,SAAO,KAAK,cAAc,QAAQ;;CAGpC,IAAI,kBAA0B;AAC5B,SAAO,KAAK,cAAc,QAAQ;;;;;;;;;;ACjyBtC,SAAgB,wBACd,eACA,SACO;AAEP,SAAQ,cAAc,MAAtB;EAEE,KAAK,UAAU,eACb,QAAO,IAAI,kBACT,cACD;EAEH,KAAK,UAAU,YACb,QAAO,IAAI,gBACT,cACD;EAEH,KAAK,UAAU,eACb,QAAO,IAAI,kBACT,cACD;EAEH,KAAK,UAAU,kBACb,QAAO,IAAI,sBACT,cACD;EAEH,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU,iBACb,QAAO,IAAI,gBACT,cACD;EAGH,KAAK,UAAU,kBACb,QAAO,IAAI,qBACT,cACD;EAEH,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU,mBACb,QAAO,IAAI,aACT,cACD;EAGH,KAAK,UAAU,kBACb,QAAO,IAAI,qBACT,cACD;EAEH,KAAK,UAAU;EACf,KAAK,UAAU,cACb,QAAO,IAAI,aACT,cACD;EAGH,KAAK,UAAU,uBACb,QAAO,IAAI,0BACT,cACD;EAEH,KAAK,UAAU,kBACb,QAAO,IAAI,sBACT,cACD;EAEH,KAAK,UAAU,mBACb,QAAO,IAAI,uBACT,cACD;EAGH,KAAK,UAAU,qBACb,QAAO,IAAI,wBACT,cACD;EAEH,KAAK,UAAU,iBACb,QAAO,IAAI,oBACT,cACD;EAEH,KAAK,UAAU;EACf,KAAK,UAAU,aACb,QAAO,IAAI,iBACT,cACD;EAEH,KAAK,UAAU,uBACb,QAAO,IAAI,0BACT,cACD;EAEH,KAAK,UAAU,YACb,QAAO,IAAI,eACT,cACD;EAEH,KAAK,UAAU,qBACb,QAAO,IAAI,UACT,cACD;EAEH,KAAK,UAAU,uBACb,QAAO,IAAI,0BACT,cACD;EAGH,KAAK,UAAU,yBACb,QAAO,IAAI,2BACT,cACD;EAEH,KAAK,UAAU,gBACb,QAAO,IAAI,uBACT,cACD;EAEH,KAAK,UAAU,qBACb,QAAO,IAAI,uBACT,cACD;EAEH,KAAK,UAAU,kBACb,QAAO,IAAI,gBACT,cACD;EAEH,KAAK,UAAU,iBACb,QAAO,IAAI,cACT,cACD;EAEH,KAAK,UAAU,oBACb,QAAO,IAAI,iBACT,cACD;EAEH,KAAK,UAAU,gBACb,QAAO,IAAI,mBACT,cACD;EAEH,KAAK,UAAU,qBACb,QAAO,IAAI,SACT,cACD;EAGH,KAAK,UAAU,iBACb,QAAO,IAAI,oBACT,cACD;EAEH,KAAK,UAAU,eACb,QAAO,IAAI,mBACT,cACD;EAEH,KAAK,UAAU,sBACb,QAAO,IAAI,yBACT,cACD;EAEH,KAAK,UAAU,qBACb,QAAO,IAAI,kBACT,cACD;EAEH,KAAK,UAAU,sBACb,QAAO,IAAI,mBACT,cACD;EAGH,KAAK,UAAU,sBACb,QAAO,IAAI,yBACT,cACD;EAEH,KAAK,UAAU,kBACb,QAAO,IAAI,qBACT,cACD;EAEH,KAAK,UAAU,qBACb,QAAO,IAAI,mBACT,cACD;EAEH,KAAK,UAAU,sBACb,QAAO,IAAI,0BACT,cACD;EAEH,KAAK,UAAU,sBACb,QAAO,IAAI,0BACT,cACD;EAIH,KAAK,UAAU,oBACb,QAAO,IAAI,kBACT,eACA,QACD;EAGH,KAAK,UAAU,kBACb,QAAO,IAAI,sBACT,cACD;EAGH,KAAK,UAAU;EACf,KAAK,UAAU;EACf,KAAK,UAAU,eACb,QAAO,IAAI,aACT,cACD;EAEH,QAEE,QAAO,IAAI,aAAa,cAAc"}
|
|
@@ -70,6 +70,7 @@ const ErrorCode = {
|
|
|
70
70
|
UNKNOWN_ERROR: "UNKNOWN_ERROR",
|
|
71
71
|
INTERNAL_ERROR: "INTERNAL_ERROR",
|
|
72
72
|
CONTAINER_UNAVAILABLE: "CONTAINER_UNAVAILABLE",
|
|
73
|
+
OPERATION_INTERRUPTED: "OPERATION_INTERRUPTED",
|
|
73
74
|
RPC_TRANSPORT_ERROR: "RPC_TRANSPORT_ERROR"
|
|
74
75
|
};
|
|
75
76
|
|
|
@@ -110,6 +111,7 @@ const ERROR_STATUS_MAP = {
|
|
|
110
111
|
[ErrorCode.PORT_IN_USE]: 409,
|
|
111
112
|
[ErrorCode.RESOURCE_BUSY]: 409,
|
|
112
113
|
[ErrorCode.SESSION_ALREADY_EXISTS]: 409,
|
|
114
|
+
[ErrorCode.OPERATION_INTERRUPTED]: 409,
|
|
113
115
|
[ErrorCode.SESSION_DESTROYED]: 410,
|
|
114
116
|
[ErrorCode.SESSION_TERMINATED]: 410,
|
|
115
117
|
[ErrorCode.FILE_TOO_LARGE]: 413,
|
|
@@ -194,10 +196,13 @@ function getSuggestion(code, context) {
|
|
|
194
196
|
case ErrorCode.BACKUP_CREATE_FAILED: return "Backup creation failed. Check that the directory exists and you have sufficient disk space";
|
|
195
197
|
case ErrorCode.BACKUP_RESTORE_FAILED: return "Backup restoration failed. The archive may be corrupted or the target directory may be in use";
|
|
196
198
|
case ErrorCode.CONTAINER_UNAVAILABLE: switch (context.reason) {
|
|
197
|
-
case "
|
|
198
|
-
case "
|
|
199
|
+
case "container_starting": return "The container is still starting. Retry the operation in a moment.";
|
|
200
|
+
case "container_unhealthy": return "The container is temporarily unhealthy. Retry the operation in a moment.";
|
|
201
|
+
case "container_replaced": return "The container runtime was replaced. Retry the operation to use the new container.";
|
|
202
|
+
case "rpc_upgrade_failed": return "The container did not accept the RPC connection before the retry budget expired. Retry the operation in a moment.";
|
|
199
203
|
default: return "The container is not ready yet. Retry the operation in a moment.";
|
|
200
204
|
}
|
|
205
|
+
case ErrorCode.OPERATION_INTERRUPTED: return context.retryable ? "Retry the operation with the same idempotency key or operation inputs so the SDK can reconcile the previous attempt." : "The operation may have started before it was interrupted. Inspect application state before retrying.";
|
|
201
206
|
case ErrorCode.RPC_TRANSPORT_ERROR: switch (context.kind) {
|
|
202
207
|
case "peer_closed": return "The container closed the WebSocket mid-call (likely a container restart, eviction, or crash). Retry the call — the SDK will open a fresh connection.";
|
|
203
208
|
case "connection_failed": return "The WebSocket connection failed. Retry the call; if the failure persists, check container health and network connectivity.";
|
|
@@ -212,5 +217,37 @@ function getSuggestion(code, context) {
|
|
|
212
217
|
}
|
|
213
218
|
|
|
214
219
|
//#endregion
|
|
215
|
-
|
|
216
|
-
|
|
220
|
+
//#region ../shared/dist/errors/types.js
|
|
221
|
+
/**
|
|
222
|
+
* Standard operation types
|
|
223
|
+
*/
|
|
224
|
+
const Operation = {
|
|
225
|
+
FILE_READ: "file.read",
|
|
226
|
+
FILE_WRITE: "file.write",
|
|
227
|
+
FILE_DELETE: "file.delete",
|
|
228
|
+
FILE_MOVE: "file.move",
|
|
229
|
+
FILE_RENAME: "file.rename",
|
|
230
|
+
FILE_STAT: "file.stat",
|
|
231
|
+
DIRECTORY_CREATE: "directory.create",
|
|
232
|
+
DIRECTORY_LIST: "directory.list",
|
|
233
|
+
COMMAND_EXECUTE: "command.execute",
|
|
234
|
+
COMMAND_STREAM: "command.stream",
|
|
235
|
+
PROCESS_START: "process.start",
|
|
236
|
+
PROCESS_KILL: "process.kill",
|
|
237
|
+
PROCESS_LIST: "process.list",
|
|
238
|
+
PROCESS_GET: "process.get",
|
|
239
|
+
PROCESS_LOGS: "process.logs",
|
|
240
|
+
GIT_CLONE: "git.clone",
|
|
241
|
+
GIT_CHECKOUT: "git.checkout",
|
|
242
|
+
GIT_OPERATION: "git.operation",
|
|
243
|
+
BACKUP_CREATE: "backup.create",
|
|
244
|
+
BACKUP_RESTORE: "backup.restore",
|
|
245
|
+
BACKUP_UNMOUNT: "backup.unmount",
|
|
246
|
+
CODE_EXECUTE: "code.execute",
|
|
247
|
+
CODE_CONTEXT_CREATE: "code.context.create",
|
|
248
|
+
CODE_CONTEXT_DELETE: "code.context.delete"
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
//#endregion
|
|
252
|
+
export { ErrorCode as i, getSuggestion as n, getHttpStatus as r, Operation as t };
|
|
253
|
+
//# sourceMappingURL=errors-k3B8orjH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-k3B8orjH.js","names":[],"sources":["../../shared/dist/errors/codes.js","../../shared/dist/errors/status-map.js","../../shared/dist/errors/suggestions.js","../../shared/dist/errors/types.js"],"sourcesContent":["/**\n * Centralized error code registry\n * Each code maps to a specific error type with consistent semantics\n */\nexport const ErrorCode = {\n // File System Errors (404)\n FILE_NOT_FOUND: 'FILE_NOT_FOUND',\n // Permission Errors (403)\n PERMISSION_DENIED: 'PERMISSION_DENIED',\n // File System Errors (409)\n FILE_EXISTS: 'FILE_EXISTS',\n // File System Errors (400)\n IS_DIRECTORY: 'IS_DIRECTORY',\n NOT_DIRECTORY: 'NOT_DIRECTORY',\n // File Too Large Errors (413)\n FILE_TOO_LARGE: 'FILE_TOO_LARGE',\n // File System Errors (500)\n NO_SPACE: 'NO_SPACE',\n TOO_MANY_FILES: 'TOO_MANY_FILES',\n RESOURCE_BUSY: 'RESOURCE_BUSY',\n READ_ONLY: 'READ_ONLY',\n NAME_TOO_LONG: 'NAME_TOO_LONG',\n TOO_MANY_LINKS: 'TOO_MANY_LINKS',\n FILESYSTEM_ERROR: 'FILESYSTEM_ERROR',\n // Command Errors (404)\n COMMAND_NOT_FOUND: 'COMMAND_NOT_FOUND',\n // Command Errors (403/400)\n COMMAND_PERMISSION_DENIED: 'COMMAND_PERMISSION_DENIED',\n INVALID_COMMAND: 'INVALID_COMMAND',\n // Command Errors (500)\n COMMAND_EXECUTION_ERROR: 'COMMAND_EXECUTION_ERROR',\n STREAM_START_ERROR: 'STREAM_START_ERROR',\n // Process Errors (404)\n PROCESS_NOT_FOUND: 'PROCESS_NOT_FOUND',\n // Process Errors (403/500)\n PROCESS_PERMISSION_DENIED: 'PROCESS_PERMISSION_DENIED',\n PROCESS_ERROR: 'PROCESS_ERROR',\n // Session Errors (409)\n SESSION_ALREADY_EXISTS: 'SESSION_ALREADY_EXISTS',\n // Session Errors (410)\n SESSION_DESTROYED: 'SESSION_DESTROYED',\n SESSION_TERMINATED: 'SESSION_TERMINATED',\n // Port Errors (409)\n PORT_ALREADY_EXPOSED: 'PORT_ALREADY_EXPOSED',\n PORT_IN_USE: 'PORT_IN_USE',\n // Port Errors (404)\n PORT_NOT_EXPOSED: 'PORT_NOT_EXPOSED',\n // Port Errors (400)\n INVALID_PORT_NUMBER: 'INVALID_PORT_NUMBER',\n INVALID_PORT: 'INVALID_PORT',\n // Port Errors (502/500)\n SERVICE_NOT_RESPONDING: 'SERVICE_NOT_RESPONDING',\n PORT_OPERATION_ERROR: 'PORT_OPERATION_ERROR',\n // Port Errors (400)\n CUSTOM_DOMAIN_REQUIRED: 'CUSTOM_DOMAIN_REQUIRED',\n // Git Errors (404)\n GIT_REPOSITORY_NOT_FOUND: 'GIT_REPOSITORY_NOT_FOUND',\n GIT_BRANCH_NOT_FOUND: 'GIT_BRANCH_NOT_FOUND',\n // Git Errors (401)\n GIT_AUTH_FAILED: 'GIT_AUTH_FAILED',\n // Git Errors (502)\n GIT_NETWORK_ERROR: 'GIT_NETWORK_ERROR',\n // Git Errors (400)\n INVALID_GIT_URL: 'INVALID_GIT_URL',\n // Git Errors (500)\n GIT_CLONE_FAILED: 'GIT_CLONE_FAILED',\n GIT_CHECKOUT_FAILED: 'GIT_CHECKOUT_FAILED',\n GIT_OPERATION_FAILED: 'GIT_OPERATION_FAILED',\n // Bucket mounting errors\n BUCKET_MOUNT_ERROR: 'BUCKET_MOUNT_ERROR',\n BUCKET_UNMOUNT_ERROR: 'BUCKET_UNMOUNT_ERROR',\n S3FS_MOUNT_ERROR: 'S3FS_MOUNT_ERROR',\n MISSING_CREDENTIALS: 'MISSING_CREDENTIALS',\n INVALID_MOUNT_CONFIG: 'INVALID_MOUNT_CONFIG',\n // Backup Errors (500)\n BACKUP_CREATE_FAILED: 'BACKUP_CREATE_FAILED',\n BACKUP_RESTORE_FAILED: 'BACKUP_RESTORE_FAILED',\n // Backup Errors (404)\n BACKUP_NOT_FOUND: 'BACKUP_NOT_FOUND',\n // Backup Errors (400)\n BACKUP_EXPIRED: 'BACKUP_EXPIRED',\n INVALID_BACKUP_CONFIG: 'INVALID_BACKUP_CONFIG',\n // Code Interpreter Errors (503)\n INTERPRETER_NOT_READY: 'INTERPRETER_NOT_READY',\n // Code Interpreter Errors (404)\n CONTEXT_NOT_FOUND: 'CONTEXT_NOT_FOUND',\n // Code Interpreter Errors (500)\n CODE_EXECUTION_ERROR: 'CODE_EXECUTION_ERROR',\n // Code Interpreter Errors (501) - Feature not available in image variant\n PYTHON_NOT_AVAILABLE: 'PYTHON_NOT_AVAILABLE',\n JAVASCRIPT_NOT_AVAILABLE: 'JAVASCRIPT_NOT_AVAILABLE',\n // OpenCode Errors (503)\n OPENCODE_STARTUP_FAILED: 'OPENCODE_STARTUP_FAILED',\n // Process Readiness Errors (408/500)\n PROCESS_READY_TIMEOUT: 'PROCESS_READY_TIMEOUT',\n PROCESS_EXITED_BEFORE_READY: 'PROCESS_EXITED_BEFORE_READY',\n // File Watch Errors (404)\n WATCH_NOT_FOUND: 'WATCH_NOT_FOUND',\n // File Watch Errors (500)\n WATCH_START_ERROR: 'WATCH_START_ERROR',\n WATCH_STOP_ERROR: 'WATCH_STOP_ERROR',\n // Validation Errors (400)\n VALIDATION_FAILED: 'VALIDATION_FAILED',\n // Generic Errors (400/500)\n INVALID_JSON_RESPONSE: 'INVALID_JSON_RESPONSE',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n // Container Availability Errors (503)\n CONTAINER_UNAVAILABLE: 'CONTAINER_UNAVAILABLE',\n // Operation Lifecycle Errors (409)\n OPERATION_INTERRUPTED: 'OPERATION_INTERRUPTED',\n // RPC Transport Errors (503) — capnweb WebSocket session-level failures\n // raised on the SDK side, not by the container. The container went away\n // mid-call (peer close), the WebSocket failed before/after upgrade, the\n // peer sent a frame the transport cannot handle, or the session was\n // disposed while a call was in flight.\n RPC_TRANSPORT_ERROR: 'RPC_TRANSPORT_ERROR'\n};\n","import { ErrorCode } from './codes';\n/**\n * Maps error codes to HTTP status codes\n * Centralized mapping ensures consistency across SDK\n */\nexport const ERROR_STATUS_MAP = {\n // 404 Not Found\n [ErrorCode.FILE_NOT_FOUND]: 404,\n [ErrorCode.COMMAND_NOT_FOUND]: 404,\n [ErrorCode.PROCESS_NOT_FOUND]: 404,\n [ErrorCode.PORT_NOT_EXPOSED]: 404,\n [ErrorCode.GIT_REPOSITORY_NOT_FOUND]: 404,\n [ErrorCode.GIT_BRANCH_NOT_FOUND]: 404,\n [ErrorCode.CONTEXT_NOT_FOUND]: 404,\n [ErrorCode.WATCH_NOT_FOUND]: 404,\n // 400 Bad Request\n [ErrorCode.IS_DIRECTORY]: 400,\n [ErrorCode.NOT_DIRECTORY]: 400,\n [ErrorCode.INVALID_COMMAND]: 400,\n [ErrorCode.INVALID_PORT_NUMBER]: 400,\n [ErrorCode.INVALID_PORT]: 400,\n [ErrorCode.INVALID_GIT_URL]: 400,\n [ErrorCode.CUSTOM_DOMAIN_REQUIRED]: 400,\n [ErrorCode.INVALID_JSON_RESPONSE]: 400,\n [ErrorCode.NAME_TOO_LONG]: 400,\n [ErrorCode.VALIDATION_FAILED]: 400,\n [ErrorCode.MISSING_CREDENTIALS]: 400,\n [ErrorCode.INVALID_MOUNT_CONFIG]: 400,\n // 401 Unauthorized\n [ErrorCode.GIT_AUTH_FAILED]: 401,\n // 403 Forbidden\n [ErrorCode.PERMISSION_DENIED]: 403,\n [ErrorCode.COMMAND_PERMISSION_DENIED]: 403,\n [ErrorCode.PROCESS_PERMISSION_DENIED]: 403,\n [ErrorCode.READ_ONLY]: 403,\n // 409 Conflict\n [ErrorCode.FILE_EXISTS]: 409,\n [ErrorCode.PORT_ALREADY_EXPOSED]: 409,\n [ErrorCode.PORT_IN_USE]: 409,\n [ErrorCode.RESOURCE_BUSY]: 409,\n [ErrorCode.SESSION_ALREADY_EXISTS]: 409,\n [ErrorCode.OPERATION_INTERRUPTED]: 409,\n // 410 Gone\n [ErrorCode.SESSION_DESTROYED]: 410,\n [ErrorCode.SESSION_TERMINATED]: 410,\n // 413 Content Too Large\n [ErrorCode.FILE_TOO_LARGE]: 413,\n // 502 Bad Gateway\n [ErrorCode.SERVICE_NOT_RESPONDING]: 502,\n [ErrorCode.GIT_NETWORK_ERROR]: 502,\n // Backup errors\n [ErrorCode.BACKUP_NOT_FOUND]: 404,\n [ErrorCode.BACKUP_EXPIRED]: 400,\n [ErrorCode.INVALID_BACKUP_CONFIG]: 400,\n [ErrorCode.BACKUP_CREATE_FAILED]: 500,\n [ErrorCode.BACKUP_RESTORE_FAILED]: 500,\n // 501 Not Implemented (feature not available in image variant)\n [ErrorCode.PYTHON_NOT_AVAILABLE]: 501,\n [ErrorCode.JAVASCRIPT_NOT_AVAILABLE]: 501,\n // 503 Service Unavailable\n [ErrorCode.INTERPRETER_NOT_READY]: 503,\n [ErrorCode.OPENCODE_STARTUP_FAILED]: 503,\n [ErrorCode.CONTAINER_UNAVAILABLE]: 503,\n [ErrorCode.RPC_TRANSPORT_ERROR]: 503,\n // 408 Request Timeout\n [ErrorCode.PROCESS_READY_TIMEOUT]: 408,\n // 500 Internal Server Error\n [ErrorCode.PROCESS_EXITED_BEFORE_READY]: 500,\n [ErrorCode.NO_SPACE]: 500,\n [ErrorCode.TOO_MANY_FILES]: 500,\n [ErrorCode.TOO_MANY_LINKS]: 500,\n [ErrorCode.FILESYSTEM_ERROR]: 500,\n [ErrorCode.COMMAND_EXECUTION_ERROR]: 500,\n [ErrorCode.STREAM_START_ERROR]: 500,\n [ErrorCode.PROCESS_ERROR]: 500,\n [ErrorCode.PORT_OPERATION_ERROR]: 500,\n [ErrorCode.GIT_CLONE_FAILED]: 500,\n [ErrorCode.GIT_CHECKOUT_FAILED]: 500,\n [ErrorCode.GIT_OPERATION_FAILED]: 500,\n [ErrorCode.CODE_EXECUTION_ERROR]: 500,\n [ErrorCode.BUCKET_MOUNT_ERROR]: 500,\n [ErrorCode.BUCKET_UNMOUNT_ERROR]: 500,\n [ErrorCode.S3FS_MOUNT_ERROR]: 500,\n [ErrorCode.WATCH_START_ERROR]: 500,\n [ErrorCode.WATCH_STOP_ERROR]: 500,\n [ErrorCode.UNKNOWN_ERROR]: 500,\n [ErrorCode.INTERNAL_ERROR]: 500\n};\n/**\n * Get HTTP status code for an error code\n * Falls back to 500 for unknown errors\n */\nexport function getHttpStatus(code) {\n return ERROR_STATUS_MAP[code] || 500;\n}\n","import { ErrorCode } from './codes';\n/**\n * Get actionable suggestion for an error code\n * Used by handlers when enriching ServiceError → ErrorResponse\n */\nexport function getSuggestion(code, context) {\n switch (code) {\n case ErrorCode.FILE_NOT_FOUND:\n return `Ensure the file exists at ${context.path} before attempting to access it`;\n case ErrorCode.FILE_EXISTS:\n return `File already exists at ${context.path}. Use a different path or delete the existing file first`;\n case ErrorCode.COMMAND_NOT_FOUND:\n return `Check that \"${context.command}\" is installed and available in the system PATH`;\n case ErrorCode.PROCESS_NOT_FOUND:\n return 'Verify the process ID is correct and the process has not already exited';\n case ErrorCode.PORT_NOT_EXPOSED:\n return `Port ${context.port} is not currently available for this operation`;\n case ErrorCode.PORT_ALREADY_EXPOSED:\n return `Port ${context.port} already has preview URL authorization or activation state`;\n case ErrorCode.PORT_IN_USE:\n return `Port ${context.port} is already in use by another service. Choose a different port`;\n case ErrorCode.SESSION_ALREADY_EXISTS:\n return `Session \"${context.sessionId}\" already exists. Use a different session ID or reuse the existing session`;\n case ErrorCode.SESSION_DESTROYED:\n return `Session \"${context.sessionId}\" was destroyed. Create a new session to continue executing commands`;\n case ErrorCode.SESSION_TERMINATED:\n return `Session \"${context.sessionId}\" ended because its shell exited (exit code: ${context.exitCode ?? 'unknown'}). Session-local state (env vars, cwd, shell functions) has been lost. Retry the call to start a fresh session, or call createSession() with the same id to recreate it explicitly`;\n case ErrorCode.INVALID_PORT:\n return `Port must be between 1 and 65535. Port ${context.port} is ${context.reason}`;\n case ErrorCode.GIT_REPOSITORY_NOT_FOUND:\n return 'Verify the repository URL is correct and accessible';\n case ErrorCode.GIT_AUTH_FAILED:\n return 'Check authentication credentials or use a public repository';\n case ErrorCode.GIT_BRANCH_NOT_FOUND:\n return `Branch \"${context.branch}\" does not exist in the repository. Check the branch name or use the default branch`;\n case ErrorCode.INTERPRETER_NOT_READY:\n return context.retryAfter\n ? `Code interpreter is starting up. Retry after ${context.retryAfter} seconds`\n : 'Code interpreter is not ready. Please wait a moment and try again';\n case ErrorCode.CONTEXT_NOT_FOUND:\n return `Context \"${context.contextId}\" does not exist. Create a context first using createContext()`;\n case ErrorCode.VALIDATION_FAILED:\n return 'Check the request parameters and ensure they match the required format';\n case ErrorCode.NO_SPACE:\n return 'Not enough disk space available. Consider cleaning up temporary files or increasing storage';\n case ErrorCode.PERMISSION_DENIED:\n return 'Operation not permitted. Check file/directory permissions';\n case ErrorCode.IS_DIRECTORY:\n return `Cannot perform this operation on a directory. Path ${context.path} is a directory`;\n case ErrorCode.NOT_DIRECTORY:\n return `Expected a directory but found a file at ${context.path}`;\n case ErrorCode.RESOURCE_BUSY:\n return 'Resource is currently in use. Wait for the current operation to complete';\n case ErrorCode.READ_ONLY:\n return 'Cannot modify a read-only resource';\n case ErrorCode.SERVICE_NOT_RESPONDING:\n return 'Service is not responding. Check if the service is running and accessible';\n case ErrorCode.BACKUP_NOT_FOUND:\n return `Backup \"${context.backupId}\" does not exist. Verify the backup ID is correct`;\n case ErrorCode.BACKUP_EXPIRED:\n return `Backup \"${context.backupId}\" has expired. Create a new backup`;\n case ErrorCode.INVALID_BACKUP_CONFIG:\n return `Invalid backup configuration: ${context.reason}`;\n case ErrorCode.BACKUP_CREATE_FAILED:\n return 'Backup creation failed. Check that the directory exists and you have sufficient disk space';\n case ErrorCode.BACKUP_RESTORE_FAILED:\n return 'Backup restoration failed. The archive may be corrupted or the target directory may be in use';\n case ErrorCode.CONTAINER_UNAVAILABLE: {\n const reason = context.reason;\n switch (reason) {\n case 'container_starting':\n return 'The container is still starting. Retry the operation in a moment.';\n case 'container_unhealthy':\n return 'The container is temporarily unhealthy. Retry the operation in a moment.';\n case 'container_replaced':\n return 'The container runtime was replaced. Retry the operation to use the new container.';\n case 'rpc_upgrade_failed':\n return 'The container did not accept the RPC connection before the retry budget expired. Retry the operation in a moment.';\n default:\n return 'The container is not ready yet. Retry the operation in a moment.';\n }\n }\n case ErrorCode.OPERATION_INTERRUPTED:\n return context.retryable\n ? 'Retry the operation with the same idempotency key or operation inputs so the SDK can reconcile the previous attempt.'\n : 'The operation may have started before it was interrupted. Inspect application state before retrying.';\n case ErrorCode.RPC_TRANSPORT_ERROR: {\n const kind = context.kind;\n switch (kind) {\n case 'peer_closed':\n return 'The container closed the WebSocket mid-call (likely a container restart, eviction, or crash). Retry the call — the SDK will open a fresh connection.';\n case 'connection_failed':\n return 'The WebSocket connection failed. Retry the call; if the failure persists, check container health and network connectivity.';\n case 'upgrade_failed':\n return 'The WebSocket upgrade was rejected by the container. Verify the container is running and reachable on the configured port.';\n case 'invalid_frame':\n return 'The container sent a frame the RPC transport cannot handle. This usually indicates a version mismatch between the SDK and the container image.';\n case 'protocol_error':\n return 'The peer sent a malformed RPC message (could not parse the wire format). This usually indicates a version mismatch between the SDK and the container image.';\n case 'session_disposed':\n return 'The RPC session was disposed while a call was in flight. Avoid reusing stubs after disconnect(); the next method call will reconnect automatically.';\n default:\n return 'The RPC transport raised an error. Retry the call — the SDK will open a fresh connection.';\n }\n }\n // Generic fallback for other errors\n default:\n return undefined;\n }\n}\n","/**\n * Standard operation types\n */\nexport const Operation = {\n // File Operations\n FILE_READ: 'file.read',\n FILE_WRITE: 'file.write',\n FILE_DELETE: 'file.delete',\n FILE_MOVE: 'file.move',\n FILE_RENAME: 'file.rename',\n FILE_STAT: 'file.stat',\n DIRECTORY_CREATE: 'directory.create',\n DIRECTORY_LIST: 'directory.list',\n // Command Operations\n COMMAND_EXECUTE: 'command.execute',\n COMMAND_STREAM: 'command.stream',\n // Process Operations\n PROCESS_START: 'process.start',\n PROCESS_KILL: 'process.kill',\n PROCESS_LIST: 'process.list',\n PROCESS_GET: 'process.get',\n PROCESS_LOGS: 'process.logs',\n // Git Operations\n GIT_CLONE: 'git.clone',\n GIT_CHECKOUT: 'git.checkout',\n GIT_OPERATION: 'git.operation',\n // Backup Operations\n BACKUP_CREATE: 'backup.create',\n BACKUP_RESTORE: 'backup.restore',\n BACKUP_UNMOUNT: 'backup.unmount',\n // Code Interpreter\n CODE_EXECUTE: 'code.execute',\n CODE_CONTEXT_CREATE: 'code.context.create',\n CODE_CONTEXT_DELETE: 'code.context.delete'\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as ExtensionHealth, i as SandboxLike, n as HTTPAuthInterceptorParams, o as ExtensionPackage, r as SandboxExtension, t as HTTPAuthHostConfig } from "../index-B7QgIs0N.js";
|
|
2
|
+
export { ExtensionHealth, ExtensionPackage, HTTPAuthHostConfig, HTTPAuthInterceptorParams, SandboxExtension, SandboxLike };
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { o as EXTENSION_TARBALL_REQUIRED } from "./dist-BStBkGIC.js";
|
|
2
|
+
import { RpcTarget } from "cloudflare:workers";
|
|
3
|
+
|
|
4
|
+
//#region src/extensions/index.ts
|
|
5
|
+
/**
|
|
6
|
+
* Unified extension surface for the Cloudflare Sandbox SDK.
|
|
7
|
+
*
|
|
8
|
+
* Every extension \u2014 whether it just drives existing control sub-APIs or
|
|
9
|
+
* ships its own container sidecar \u2014 shares one shape: a class extending
|
|
10
|
+
* {@link SandboxExtension}, captured lazily via a `withX(this)` factory.
|
|
11
|
+
*
|
|
12
|
+
* - No sidecar? Extend {@link SandboxExtension} and use `this.exec()` or
|
|
13
|
+
* `this.client.<subApi>` (`commands`, `files`, `interpreter`, \u2026). Don't pass
|
|
14
|
+
* a package.
|
|
15
|
+
* - Need a container sidecar? Pass an {@link ExtensionPackage} to `super()`.
|
|
16
|
+
* Then call {@link SandboxExtension.sidecar} to obtain the sidecar's typed
|
|
17
|
+
* capnweb remote main. Calls on that stub stream through capnweb \u2014 callback
|
|
18
|
+
* parameters round-trip across both the DO\u2192container and container\u2192sidecar
|
|
19
|
+
* hops.
|
|
20
|
+
*
|
|
21
|
+
* `ExtensionPackage` carries tarball bytes produced by an extension build.
|
|
22
|
+
* The SDK sends those bytes only when the container has not provisioned the
|
|
23
|
+
* package hash yet.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* The one base class for *every* extension.
|
|
27
|
+
*
|
|
28
|
+
* - SDK-only: just drives existing sub-APIs.
|
|
29
|
+
* - Sidecar: pass an {@link ExtensionPackage} to `super(sandbox, pkg)` and
|
|
30
|
+
* call `this.sidecar<T>()` to get a typed capnweb stub of the sidecar.
|
|
31
|
+
*
|
|
32
|
+
* The sidecar accessor throws a clear error if no package was supplied, so an
|
|
33
|
+
* extension only "becomes" a sidecar extension when it opts in.
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* // SDK-only
|
|
37
|
+
* class Git extends SandboxExtension {
|
|
38
|
+
* constructor(s: SandboxLike) { super(s); }
|
|
39
|
+
* async status(sid: string) {
|
|
40
|
+
* return this.exec('git status', { sessionId: sid }).output();
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
*
|
|
44
|
+
* // Sidecar
|
|
45
|
+
* import sidecarTarballBytes from './sidecar-package.tgz';
|
|
46
|
+
* import type { MyAPI } from './shared';
|
|
47
|
+
*
|
|
48
|
+
* class MyExt extends SandboxExtension {
|
|
49
|
+
* constructor(s: SandboxLike) { super(s, { tarball: new Uint8Array(sidecarTarballBytes) }); }
|
|
50
|
+
* async run(input: string): Promise<string> {
|
|
51
|
+
* const api = await this.sidecar<MyAPI>();
|
|
52
|
+
* return api.run(input);
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* RPC-safety: the sandbox lives in `#sandbox` and is reached only through the
|
|
58
|
+
* `protected` `client` getter (a prototype accessor, not an own property),
|
|
59
|
+
* so it is never serialised across RPC. Only the public methods you add form
|
|
60
|
+
* the extension's RPC surface.
|
|
61
|
+
*/
|
|
62
|
+
var SandboxExtension = class extends RpcTarget {
|
|
63
|
+
#sandbox;
|
|
64
|
+
#pkg;
|
|
65
|
+
#hashPromise;
|
|
66
|
+
constructor(sandbox, pkg) {
|
|
67
|
+
super();
|
|
68
|
+
this.#sandbox = sandbox;
|
|
69
|
+
this.#pkg = pkg;
|
|
70
|
+
}
|
|
71
|
+
/** The container control client. Use inside your own methods, lazily. */
|
|
72
|
+
get client() {
|
|
73
|
+
return this.#sandbox.client;
|
|
74
|
+
}
|
|
75
|
+
/** Unified process-handle exec surface from the owning Sandbox. */
|
|
76
|
+
exec(command, options) {
|
|
77
|
+
const exec = this.#sandbox.exec;
|
|
78
|
+
if (!exec) throw new Error("Sandbox extension requires the unified exec surface from the owning Sandbox");
|
|
79
|
+
return exec.call(this.#sandbox, command, options);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Sandbox-level environment variables. Apply these to sessionless execution
|
|
83
|
+
* so commands driven straight through `client` still inherit sandbox env
|
|
84
|
+
* (tokens, proxy settings) the way the Sandbox's own sessionless path does.
|
|
85
|
+
*/
|
|
86
|
+
get envVars() {
|
|
87
|
+
return this.#sandbox.envVars ?? {};
|
|
88
|
+
}
|
|
89
|
+
get httpAuthInterceptor() {
|
|
90
|
+
const register = this.#sandbox.registerGitAuthInterceptor;
|
|
91
|
+
return register ? (params) => register.call(this.#sandbox, params) : void 0;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Return the sidecar's capnweb remote main, provisioning + spawning on
|
|
95
|
+
* demand. `T` is the typed interface the sidecar exposes (its
|
|
96
|
+
* `SandboxSidecar` subclass shape). Each call reconnects through the host
|
|
97
|
+
* so a crashed sidecar can be restarted transparently on the next use.
|
|
98
|
+
*
|
|
99
|
+
* Streaming is just a method that takes a callback parameter: capnweb
|
|
100
|
+
* stubs the callback and routes invocations back through the SDK\u2192container
|
|
101
|
+
* \u2192sidecar hops.
|
|
102
|
+
*/
|
|
103
|
+
sidecar() {
|
|
104
|
+
return (async () => this.#connect(this.#requirePackage()))();
|
|
105
|
+
}
|
|
106
|
+
/** Health snapshot for this extension's sidecar. */
|
|
107
|
+
async sidecarHealth() {
|
|
108
|
+
const hash = await this.#hashOnce();
|
|
109
|
+
return this.#sandbox.client.extensions.health(hash);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Stop this extension's sidecar. The next `sidecar()` call will respawn on
|
|
113
|
+
* demand.
|
|
114
|
+
*/
|
|
115
|
+
async stopSidecar() {
|
|
116
|
+
const hash = await this.#hashOnce();
|
|
117
|
+
await this.#sandbox.client.extensions.stop(hash);
|
|
118
|
+
}
|
|
119
|
+
async #connect(pkg) {
|
|
120
|
+
const packageHash = await this.#hashOnce();
|
|
121
|
+
const api = this.#sandbox.client.extensions;
|
|
122
|
+
try {
|
|
123
|
+
return await api.connect({
|
|
124
|
+
packageHash,
|
|
125
|
+
bin: pkg.bin,
|
|
126
|
+
readinessTimeoutMs: pkg.readinessTimeoutMs,
|
|
127
|
+
allowInstallScripts: pkg.allowInstallScripts
|
|
128
|
+
});
|
|
129
|
+
} catch (error) {
|
|
130
|
+
if (!isTarballRequiredError(error)) throw error;
|
|
131
|
+
try {
|
|
132
|
+
return await api.connect({
|
|
133
|
+
packageHash,
|
|
134
|
+
tarball: pkg.tarball,
|
|
135
|
+
bin: pkg.bin,
|
|
136
|
+
readinessTimeoutMs: pkg.readinessTimeoutMs,
|
|
137
|
+
allowInstallScripts: pkg.allowInstallScripts
|
|
138
|
+
});
|
|
139
|
+
} catch (retryError) {
|
|
140
|
+
throw createSidecarProvisioningError(packageHash, retryError);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
#hashOnce() {
|
|
145
|
+
const pkg = this.#requirePackage();
|
|
146
|
+
this.#hashPromise ??= sha256Hex(pkg.tarball);
|
|
147
|
+
return this.#hashPromise;
|
|
148
|
+
}
|
|
149
|
+
#requirePackage() {
|
|
150
|
+
if (!this.#pkg) throw new Error("This extension has no sidecar package. Pass one to `super(sandbox, pkg)` to use sidecar/sidecarHealth/stopSidecar.");
|
|
151
|
+
return this.#pkg;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* Recognise the host's `ExtensionTarballRequired` error across the capnweb
|
|
156
|
+
* boundary. There are two cases:
|
|
157
|
+
*
|
|
158
|
+
* 1. capnweb preserves `Error.name`, so the primary wire-safe contract is the
|
|
159
|
+
* string constant `EXTENSION_TARBALL_REQUIRED`.
|
|
160
|
+
* 2. capnweb sometimes re-wraps the error as an `RPCTransportError`, discarding
|
|
161
|
+
* `name` but preserving the message text. We fall back to matching the
|
|
162
|
+
* message so the tarball retry still fires in that case.
|
|
163
|
+
*/
|
|
164
|
+
function isTarballRequiredError(error) {
|
|
165
|
+
if (typeof error !== "object" || error === null) return false;
|
|
166
|
+
const candidate = error;
|
|
167
|
+
if (candidate.name === EXTENSION_TARBALL_REQUIRED) return true;
|
|
168
|
+
if (candidate.code === EXTENSION_TARBALL_REQUIRED) return true;
|
|
169
|
+
if (typeof candidate.message !== "string") return false;
|
|
170
|
+
return candidate.message.includes(EXTENSION_TARBALL_REQUIRED) || /Extension package '[0-9a-f]{64}' is not provisioned/.test(candidate.message);
|
|
171
|
+
}
|
|
172
|
+
function createSidecarProvisioningError(packageHash, cause) {
|
|
173
|
+
const causeMessage = cause instanceof Error ? cause.message : typeof cause === "string" ? cause : String(cause);
|
|
174
|
+
return new Error(`Failed to provision sandbox sidecar package '${packageHash}'. The sidecar tarball was sent to the container, but the container could not install or start it. Check that the extension build generated a valid npm-style .tgz, that the .tgz is included in the Worker bundle, and that the sidecar package declares a valid package.json bin/sandboxExtension entry. Cause: ${causeMessage}`, { cause });
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Hex sha256 of a tarball via Web Crypto, which is available in workerd and
|
|
178
|
+
* every modern runtime. Avoids a Node-only path so this module stays
|
|
179
|
+
* Worker-bundle-safe.
|
|
180
|
+
*/
|
|
181
|
+
async function sha256Hex(bytes) {
|
|
182
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
183
|
+
const view = new Uint8Array(digest);
|
|
184
|
+
let hex = "";
|
|
185
|
+
for (const byte of view) hex += byte.toString(16).padStart(2, "0");
|
|
186
|
+
return hex;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
//#endregion
|
|
190
|
+
export { SandboxExtension as t };
|
|
191
|
+
//# sourceMappingURL=extensions-CepYdzro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions-CepYdzro.js","names":["#sandbox","#pkg","#connect","#requirePackage","#hashOnce","#hashPromise"],"sources":["../src/extensions/index.ts"],"sourcesContent":["/**\n * Unified extension surface for the Cloudflare Sandbox SDK.\n *\n * Every extension \\u2014 whether it just drives existing control sub-APIs or\n * ships its own container sidecar \\u2014 shares one shape: a class extending\n * {@link SandboxExtension}, captured lazily via a `withX(this)` factory.\n *\n * - No sidecar? Extend {@link SandboxExtension} and use `this.exec()` or\n * `this.client.<subApi>` (`commands`, `files`, `interpreter`, \\u2026). Don't pass\n * a package.\n * - Need a container sidecar? Pass an {@link ExtensionPackage} to `super()`.\n * Then call {@link SandboxExtension.sidecar} to obtain the sidecar's typed\n * capnweb remote main. Calls on that stub stream through capnweb \\u2014 callback\n * parameters round-trip across both the DO\\u2192container and container\\u2192sidecar\n * hops.\n *\n * `ExtensionPackage` carries tarball bytes produced by an extension build.\n * The SDK sends those bytes only when the container has not provisioned the\n * package hash yet.\n */\n\nimport { RpcTarget } from 'cloudflare:workers';\nimport type {\n ExtensionHealth,\n ExtensionPackage,\n SandboxAPI,\n SandboxExecOptions,\n SandboxProcessPromise\n} from '@repo/shared';\nimport { EXTENSION_TARBALL_REQUIRED } from '@repo/shared';\n\n// Re-export the wire types so consumers can author extensions from this\n// subpath without reaching into `@repo/shared` directly.\nexport type { ExtensionHealth, ExtensionPackage } from '@repo/shared';\n\nexport interface HTTPAuthHostConfig {\n token: string;\n username?: string;\n type?: 'basic' | 'bearer';\n}\n\nexport interface HTTPAuthInterceptorParams {\n hosts: Record<string, HTTPAuthHostConfig>;\n}\n\n/**\n * The slice of the Sandbox an extension captures: its control `client`, unified\n * `exec()` surface, and sandbox-level environment variables. Narrow on purpose\n * \\u2014 an extension never holds the whole instance.\n *\n * `envVars` mirrors what the Sandbox applies to sessionless execution, so an\n * extension that drives commands through `client` directly can still honour\n * sandbox-level env (tokens, proxy settings) without an explicit session.\n */\nexport type SandboxLike = {\n readonly client: SandboxAPI;\n readonly exec?: (\n command: string | string[],\n options?: SandboxExecOptions\n ) => SandboxProcessPromise;\n readonly envVars?: Record<string, string>;\n registerGitAuthInterceptor?: (\n params: HTTPAuthInterceptorParams\n ) => Promise<void>;\n};\n\n/**\n * The one base class for *every* extension.\n *\n * - SDK-only: just drives existing sub-APIs.\n * - Sidecar: pass an {@link ExtensionPackage} to `super(sandbox, pkg)` and\n * call `this.sidecar<T>()` to get a typed capnweb stub of the sidecar.\n *\n * The sidecar accessor throws a clear error if no package was supplied, so an\n * extension only \"becomes\" a sidecar extension when it opts in.\n *\n * ```ts\n * // SDK-only\n * class Git extends SandboxExtension {\n * constructor(s: SandboxLike) { super(s); }\n * async status(sid: string) {\n * return this.exec('git status', { sessionId: sid }).output();\n * }\n * }\n *\n * // Sidecar\n * import sidecarTarballBytes from './sidecar-package.tgz';\n * import type { MyAPI } from './shared';\n *\n * class MyExt extends SandboxExtension {\n * constructor(s: SandboxLike) { super(s, { tarball: new Uint8Array(sidecarTarballBytes) }); }\n * async run(input: string): Promise<string> {\n * const api = await this.sidecar<MyAPI>();\n * return api.run(input);\n * }\n * }\n * ```\n *\n * RPC-safety: the sandbox lives in `#sandbox` and is reached only through the\n * `protected` `client` getter (a prototype accessor, not an own property),\n * so it is never serialised across RPC. Only the public methods you add form\n * the extension's RPC surface.\n */\nexport abstract class SandboxExtension extends RpcTarget {\n readonly #sandbox: SandboxLike;\n readonly #pkg: ExtensionPackage | undefined;\n #hashPromise: Promise<string> | undefined;\n\n protected constructor(sandbox: SandboxLike, pkg?: ExtensionPackage) {\n super();\n this.#sandbox = sandbox;\n this.#pkg = pkg;\n }\n\n /** The container control client. Use inside your own methods, lazily. */\n protected get client(): SandboxAPI {\n return this.#sandbox.client;\n }\n\n /** Unified process-handle exec surface from the owning Sandbox. */\n protected exec(\n command: string | string[],\n options?: SandboxExecOptions\n ): SandboxProcessPromise {\n const exec = this.#sandbox.exec;\n if (!exec) {\n throw new Error(\n 'Sandbox extension requires the unified exec surface from the owning Sandbox'\n );\n }\n return exec.call(this.#sandbox, command, options);\n }\n\n /**\n * Sandbox-level environment variables. Apply these to sessionless execution\n * so commands driven straight through `client` still inherit sandbox env\n * (tokens, proxy settings) the way the Sandbox's own sessionless path does.\n */\n protected get envVars(): Record<string, string> {\n return this.#sandbox.envVars ?? {};\n }\n\n protected get httpAuthInterceptor():\n | ((params: HTTPAuthInterceptorParams) => Promise<void>)\n | undefined {\n const register = this.#sandbox.registerGitAuthInterceptor;\n return register\n ? (params) => register.call(this.#sandbox, params)\n : undefined;\n }\n\n /**\n * Return the sidecar's capnweb remote main, provisioning + spawning on\n * demand. `T` is the typed interface the sidecar exposes (its\n * `SandboxSidecar` subclass shape). Each call reconnects through the host\n * so a crashed sidecar can be restarted transparently on the next use.\n *\n * Streaming is just a method that takes a callback parameter: capnweb\n * stubs the callback and routes invocations back through the SDK\\u2192container\n * \\u2192sidecar hops.\n */\n protected sidecar<T extends object>(): Promise<T> {\n // Wrap the synchronous `#requirePackage` check in an async closure so a\n // missing-package error surfaces as a rejected promise, not a sync throw\n // -- callers always treat `sidecar()` as awaitable.\n return (async () => this.#connect(this.#requirePackage()))() as Promise<T>;\n }\n\n /** Health snapshot for this extension's sidecar. */\n protected async sidecarHealth(): Promise<ExtensionHealth> {\n const hash = await this.#hashOnce();\n return this.#sandbox.client.extensions.health(hash);\n }\n\n /**\n * Stop this extension's sidecar. The next `sidecar()` call will respawn on\n * demand.\n */\n protected async stopSidecar(): Promise<void> {\n const hash = await this.#hashOnce();\n await this.#sandbox.client.extensions.stop(hash);\n }\n\n // --- internals -----------------------------------------------------------\n\n async #connect(pkg: ExtensionPackage): Promise<object> {\n const packageHash = await this.#hashOnce();\n const api = this.#sandbox.client.extensions;\n\n // Hash-first: ask the host whether this process already has the package.\n // If it doesn't, retry once with the tarball bytes attached.\n try {\n return (await api.connect({\n packageHash,\n bin: pkg.bin,\n readinessTimeoutMs: pkg.readinessTimeoutMs,\n allowInstallScripts: pkg.allowInstallScripts\n })) as object;\n } catch (error) {\n if (!isTarballRequiredError(error)) throw error;\n try {\n return (await api.connect({\n packageHash,\n tarball: pkg.tarball,\n bin: pkg.bin,\n readinessTimeoutMs: pkg.readinessTimeoutMs,\n allowInstallScripts: pkg.allowInstallScripts\n })) as object;\n } catch (retryError) {\n throw createSidecarProvisioningError(packageHash, retryError);\n }\n }\n }\n\n #hashOnce(): Promise<string> {\n const pkg = this.#requirePackage();\n this.#hashPromise ??= sha256Hex(pkg.tarball);\n return this.#hashPromise;\n }\n\n #requirePackage(): ExtensionPackage {\n if (!this.#pkg) {\n throw new Error(\n 'This extension has no sidecar package. Pass one to `super(sandbox, pkg)` to use sidecar/sidecarHealth/stopSidecar.'\n );\n }\n return this.#pkg;\n }\n}\n\n/**\n * Recognise the host's `ExtensionTarballRequired` error across the capnweb\n * boundary. There are two cases:\n *\n * 1. capnweb preserves `Error.name`, so the primary wire-safe contract is the\n * string constant `EXTENSION_TARBALL_REQUIRED`.\n * 2. capnweb sometimes re-wraps the error as an `RPCTransportError`, discarding\n * `name` but preserving the message text. We fall back to matching the\n * message so the tarball retry still fires in that case.\n */\nfunction isTarballRequiredError(error: unknown): boolean {\n if (typeof error !== 'object' || error === null) return false;\n const candidate = error as {\n name?: unknown;\n message?: unknown;\n code?: unknown;\n };\n if (candidate.name === EXTENSION_TARBALL_REQUIRED) return true;\n if (candidate.code === EXTENSION_TARBALL_REQUIRED) return true;\n if (typeof candidate.message !== 'string') return false;\n return (\n candidate.message.includes(EXTENSION_TARBALL_REQUIRED) ||\n /Extension package '[0-9a-f]{64}' is not provisioned/.test(\n candidate.message\n )\n );\n}\n\nfunction createSidecarProvisioningError(\n packageHash: string,\n cause: unknown\n): Error {\n const causeMessage =\n cause instanceof Error\n ? cause.message\n : typeof cause === 'string'\n ? cause\n : String(cause);\n return new Error(\n `Failed to provision sandbox sidecar package '${packageHash}'. The sidecar tarball was sent to the container, but the container could not install or start it. Check that the extension build generated a valid npm-style .tgz, that the .tgz is included in the Worker bundle, and that the sidecar package declares a valid package.json bin/sandboxExtension entry. Cause: ${causeMessage}`,\n { cause }\n );\n}\n\n/**\n * Hex sha256 of a tarball via Web Crypto, which is available in workerd and\n * every modern runtime. Avoids a Node-only path so this module stays\n * Worker-bundle-safe.\n */\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', bytes as BufferSource);\n const view = new Uint8Array(digest);\n let hex = '';\n for (const byte of view) {\n hex += byte.toString(16).padStart(2, '0');\n }\n return hex;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuGA,IAAsB,mBAAtB,cAA+C,UAAU;CACvD,CAASA;CACT,CAASC;CACT;CAEA,AAAU,YAAY,SAAsB,KAAwB;AAClE,SAAO;AACP,QAAKD,UAAW;AAChB,QAAKC,MAAO;;;CAId,IAAc,SAAqB;AACjC,SAAO,MAAKD,QAAS;;;CAIvB,AAAU,KACR,SACA,SACuB;EACvB,MAAM,OAAO,MAAKA,QAAS;AAC3B,MAAI,CAAC,KACH,OAAM,IAAI,MACR,8EACD;AAEH,SAAO,KAAK,KAAK,MAAKA,SAAU,SAAS,QAAQ;;;;;;;CAQnD,IAAc,UAAkC;AAC9C,SAAO,MAAKA,QAAS,WAAW,EAAE;;CAGpC,IAAc,sBAEA;EACZ,MAAM,WAAW,MAAKA,QAAS;AAC/B,SAAO,YACF,WAAW,SAAS,KAAK,MAAKA,SAAU,OAAO,GAChD;;;;;;;;;;;;CAaN,AAAU,UAAwC;AAIhD,UAAQ,YAAY,MAAKE,QAAS,MAAKC,gBAAiB,CAAC,GAAG;;;CAI9D,MAAgB,gBAA0C;EACxD,MAAM,OAAO,MAAM,MAAKC,UAAW;AACnC,SAAO,MAAKJ,QAAS,OAAO,WAAW,OAAO,KAAK;;;;;;CAOrD,MAAgB,cAA6B;EAC3C,MAAM,OAAO,MAAM,MAAKI,UAAW;AACnC,QAAM,MAAKJ,QAAS,OAAO,WAAW,KAAK,KAAK;;CAKlD,OAAME,QAAS,KAAwC;EACrD,MAAM,cAAc,MAAM,MAAKE,UAAW;EAC1C,MAAM,MAAM,MAAKJ,QAAS,OAAO;AAIjC,MAAI;AACF,UAAQ,MAAM,IAAI,QAAQ;IACxB;IACA,KAAK,IAAI;IACT,oBAAoB,IAAI;IACxB,qBAAqB,IAAI;IAC1B,CAAC;WACK,OAAO;AACd,OAAI,CAAC,uBAAuB,MAAM,CAAE,OAAM;AAC1C,OAAI;AACF,WAAQ,MAAM,IAAI,QAAQ;KACxB;KACA,SAAS,IAAI;KACb,KAAK,IAAI;KACT,oBAAoB,IAAI;KACxB,qBAAqB,IAAI;KAC1B,CAAC;YACK,YAAY;AACnB,UAAM,+BAA+B,aAAa,WAAW;;;;CAKnE,YAA6B;EAC3B,MAAM,MAAM,MAAKG,gBAAiB;AAClC,QAAKE,gBAAiB,UAAU,IAAI,QAAQ;AAC5C,SAAO,MAAKA;;CAGd,kBAAoC;AAClC,MAAI,CAAC,MAAKJ,IACR,OAAM,IAAI,MACR,qHACD;AAEH,SAAO,MAAKA;;;;;;;;;;;;;AAchB,SAAS,uBAAuB,OAAyB;AACvD,KAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;CACxD,MAAM,YAAY;AAKlB,KAAI,UAAU,SAAS,2BAA4B,QAAO;AAC1D,KAAI,UAAU,SAAS,2BAA4B,QAAO;AAC1D,KAAI,OAAO,UAAU,YAAY,SAAU,QAAO;AAClD,QACE,UAAU,QAAQ,SAAS,2BAA2B,IACtD,sDAAsD,KACpD,UAAU,QACX;;AAIL,SAAS,+BACP,aACA,OACO;CACP,MAAM,eACJ,iBAAiB,QACb,MAAM,UACN,OAAO,UAAU,WACf,QACA,OAAO,MAAM;AACrB,QAAO,IAAI,MACT,gDAAgD,YAAY,oTAAoT,gBAChX,EAAE,OAAO,CACV;;;;;;;AAQH,eAAe,UAAU,OAAoC;CAC3D,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,MAAsB;CAC3E,MAAM,OAAO,IAAI,WAAW,OAAO;CACnC,IAAI,MAAM;AACV,MAAK,MAAM,QAAQ,KACjB,QAAO,KAAK,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI;AAE3C,QAAO"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { i as SandboxLike, r as SandboxExtension, t as HTTPAuthHostConfig } from "../index-B7QgIs0N.js";
|
|
2
|
+
|
|
3
|
+
//#region ../../extensions/git/src/types.d.ts
|
|
4
|
+
|
|
5
|
+
/** Result of a git clone (`checkout`) operation. */
|
|
6
|
+
interface GitCheckoutResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
repoUrl: string;
|
|
9
|
+
branch: string;
|
|
10
|
+
targetDir: string;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
exitCode?: number;
|
|
13
|
+
}
|
|
14
|
+
type GitHostAuth = HTTPAuthHostConfig;
|
|
15
|
+
interface GitAuthConfig {
|
|
16
|
+
github?: GitHostAuth;
|
|
17
|
+
gitlab?: GitHostAuth;
|
|
18
|
+
bitbucket?: GitHostAuth;
|
|
19
|
+
hosts?: Record<string, GitHostAuth>;
|
|
20
|
+
}
|
|
21
|
+
interface GitExtensionOptions {
|
|
22
|
+
auth?: GitAuthConfig;
|
|
23
|
+
}
|
|
24
|
+
/** Options shared by every git extension method. */
|
|
25
|
+
interface GitSessionOptions {
|
|
26
|
+
/**
|
|
27
|
+
* Session to run the git command in. Omit to run sessionless (the command
|
|
28
|
+
* runs in a fresh, non-persistent shell). Sessionless commands still inherit
|
|
29
|
+
* the sandbox-level environment variables (e.g. tokens, proxy settings), so
|
|
30
|
+
* auth and egress configured on the sandbox keep working. Pass a session id
|
|
31
|
+
* to run inside an existing session so its working directory and environment
|
|
32
|
+
* carry over instead.
|
|
33
|
+
*/
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Options for cloning a repository. */
|
|
37
|
+
interface GitCheckoutOptions extends GitSessionOptions {
|
|
38
|
+
/** Branch (or tag) to check out after cloning. */
|
|
39
|
+
branch?: string;
|
|
40
|
+
/** Directory to clone into. Defaults to `/workspace/<repoName>`. */
|
|
41
|
+
targetDir?: string;
|
|
42
|
+
/** Clone depth for shallow clones (e.g. 1 for the latest commit only). */
|
|
43
|
+
depth?: number;
|
|
44
|
+
/** Maximum wall-clock time for the git clone subprocess, in milliseconds. */
|
|
45
|
+
cloneTimeoutMs?: number;
|
|
46
|
+
auth?: GitAuthConfig | false;
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region ../../extensions/git/src/index.d.ts
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The git extension. Drives `git` in the container through the commands
|
|
53
|
+
* control sub-API and translates failures into the SDK's typed git errors.
|
|
54
|
+
*/
|
|
55
|
+
declare class Git extends SandboxExtension {
|
|
56
|
+
#private;
|
|
57
|
+
constructor(sandbox: SandboxLike, options?: GitExtensionOptions);
|
|
58
|
+
/**
|
|
59
|
+
* Clone a repository. Returns the resolved target directory and the branch
|
|
60
|
+
* actually checked out (queried from git, not assumed).
|
|
61
|
+
*/
|
|
62
|
+
checkout(repoUrl: string, options?: GitCheckoutOptions): Promise<GitCheckoutResult>;
|
|
63
|
+
/** Check out an existing branch in a cloned repository. */
|
|
64
|
+
checkoutBranch(repoPath: string, branch: string, options?: GitSessionOptions): Promise<void>;
|
|
65
|
+
/** Return the current branch of a cloned repository. */
|
|
66
|
+
getCurrentBranch(repoPath: string, options?: GitSessionOptions): Promise<string>;
|
|
67
|
+
/** List local and remote branches of a cloned repository. */
|
|
68
|
+
listBranches(repoPath: string, options?: GitSessionOptions): Promise<string[]>;
|
|
69
|
+
}
|
|
70
|
+
/** Factory — the consumer-facing API. */
|
|
71
|
+
declare function withGit(sandbox: SandboxLike, options?: GitExtensionOptions): Git;
|
|
72
|
+
//#endregion
|
|
73
|
+
export { Git, type GitAuthConfig, type GitCheckoutOptions, type GitCheckoutResult, type GitExtensionOptions, type GitHostAuth, type GitSessionOptions, withGit as default, withGit };
|
|
74
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../../extensions/git/src/types.ts","../../../../extensions/git/src/index.ts"],"sourcesContent":[],"mappings":";;;;AAmBA;AAEiB,UAXA,iBAAA,CAWa;EACnB,OAAA,EAAA,OAAA;EACA,OAAA,EAAA,MAAA;EACG,MAAA,EAAA,MAAA;EACW,SAAA,EAAA,MAAA;EAAf,SAAA,EAAA,MAAA;EAAM,QAAA,CAAA,EAAA,MAAA;AAKhB;AAKiB,KAhBL,WAAA,GAAc,kBAgBQ;AAajB,UA3BA,aAAA,CA2BmB;WA1BzB;WACA;cACG;EC4DD,KAAA,CAAI,ED3DP,MC2DO,CAAA,MAAA,ED3DQ,WC2DR,CAAA;;AAcJ,UDpEI,mBAAA,CCoEJ;EACA,IAAA,CAAA,EDpEJ,aCoEI;;;AAuGR,UDvKY,iBAAA,CCuKZ;EAqDQ;;;;;;AA0Lb;;EAEW,SAAA,CAAA,EAAA,MAAA;;;UD3YM,kBAAA,SAA2B;;;;;;;;;SASnC;;;;;;ACgYT;;;AAGG,cAxWU,GAAA,SAAY,gBAAA,CAwWtB;EAAG,CAAA,OAAA;uBArWiB,uBAAsB;;;;;sCAWhC,qBACR,QAAQ;;6DAsGA,oBACR;;+CAqDQ,oBACR;;2CAoCQ,oBACR;;;iBAoJW,OAAA,UACL,uBACA,sBACR"}
|