sandbox-agent 0.5.0-rc.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-7BNDCDDU.js +18 -0
- package/dist/chunk-7BNDCDDU.js.map +1 -0
- package/dist/{chunk-TVCDKGSM.js → chunk-TEHINGEG.js} +5 -2
- package/dist/chunk-TEHINGEG.js.map +1 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/agentcomputer.d.ts +37 -0
- package/dist/providers/agentcomputer.js +318 -0
- package/dist/providers/agentcomputer.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +1 -1
- package/dist/providers/computesdk.d.ts +1 -1
- package/dist/providers/computesdk.js +1 -1
- package/dist/providers/daytona.d.ts +2 -1
- package/dist/providers/daytona.js +4 -2
- package/dist/providers/daytona.js.map +1 -1
- package/dist/providers/docker.d.ts +1 -1
- package/dist/providers/docker.js +1 -1
- package/dist/providers/e2b.d.ts +1 -1
- package/dist/providers/e2b.js +11 -6
- package/dist/providers/e2b.js.map +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/modal.d.ts +1 -1
- package/dist/providers/modal.js +1 -1
- package/dist/providers/sprites.d.ts +22 -0
- package/dist/providers/sprites.js +209 -0
- package/dist/providers/sprites.js.map +1 -0
- package/dist/providers/vercel.d.ts +1 -1
- package/dist/providers/vercel.js +1 -1
- package/dist/{types-DdcvY5CI.d.ts → types--QirRZeL.d.ts} +5 -0
- package/package.json +19 -6
- package/dist/chunk-REA2EEYN.js +0 -15
- package/dist/chunk-REA2EEYN.js.map +0 -1
- package/dist/chunk-TVCDKGSM.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { NewSessionRequest, SessionConfigOption, SessionModeState, AnyMessage, AcpEnvelopeDirection, RequestPermissionRequest, RequestPermissionResponse, NewSessionResponse, PermissionOptionKind, PromptRequest, PromptResponse, SetSessionModeResponse, SetSessionConfigOptionResponse } from 'acp-http-client';
|
|
2
2
|
export { AcpRpcError } from 'acp-http-client';
|
|
3
|
-
import { S as SandboxProvider } from './types
|
|
3
|
+
import { S as SandboxProvider } from './types--QirRZeL.js';
|
|
4
4
|
export { S as SandboxAgentSpawnLogMode, a as SandboxAgentSpawnOptions } from './spawn-76JDF5d3.js';
|
|
5
|
+
export { SpritesClientOverrides, SpritesCreateOverrides, SpritesProviderOptions } from './providers/sprites.js';
|
|
6
|
+
import '@fly/sprites';
|
|
5
7
|
|
|
6
8
|
interface components {
|
|
7
9
|
schemas: {
|
|
@@ -383,7 +385,7 @@ interface components {
|
|
|
383
385
|
directory: string;
|
|
384
386
|
mcpName: string;
|
|
385
387
|
};
|
|
386
|
-
McpServerConfig:
|
|
388
|
+
McpServerConfig: {
|
|
387
389
|
args?: string[];
|
|
388
390
|
command: string;
|
|
389
391
|
cwd?: string | null;
|
|
@@ -395,7 +397,7 @@ interface components {
|
|
|
395
397
|
timeoutMs?: number | null;
|
|
396
398
|
/** @enum {string} */
|
|
397
399
|
type: "local";
|
|
398
|
-
}
|
|
400
|
+
} | {
|
|
399
401
|
bearerTokenEnvVar?: string | null;
|
|
400
402
|
enabled?: boolean | null;
|
|
401
403
|
envHeaders?: {
|
|
@@ -411,7 +413,7 @@ interface components {
|
|
|
411
413
|
/** @enum {string} */
|
|
412
414
|
type: "remote";
|
|
413
415
|
url: string;
|
|
414
|
-
}
|
|
416
|
+
};
|
|
415
417
|
ProblemDetails: {
|
|
416
418
|
detail?: string | null;
|
|
417
419
|
instance?: string | null;
|
|
@@ -3141,6 +3143,7 @@ declare class SandboxAgent {
|
|
|
3141
3143
|
private sandboxProvider?;
|
|
3142
3144
|
private sandboxProviderId?;
|
|
3143
3145
|
private sandboxProviderRawId?;
|
|
3146
|
+
private sandboxInspectorUrl?;
|
|
3144
3147
|
private readonly persist;
|
|
3145
3148
|
private readonly replayMaxEvents;
|
|
3146
3149
|
private readonly replayMaxChars;
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/inspector.ts"],"sourcesContent":["export {\n LiveAcpConnection,\n ProcessTerminalSession,\n SandboxAgent,\n SandboxAgentError,\n SandboxDestroyedError,\n Session,\n UnsupportedPermissionReplyError,\n UnsupportedSessionCategoryError,\n UnsupportedSessionConfigOptionError,\n UnsupportedSessionValueError,\n} from \"./client.ts\";\n\nexport { AcpRpcError } from \"acp-http-client\";\n\nexport { buildInspectorUrl } from \"./inspector.ts\";\nexport { DesktopStreamSession } from \"./desktop-stream.ts\";\nexport type {\n DesktopStreamConnectOptions,\n DesktopStreamErrorStatus,\n DesktopStreamReadyStatus,\n DesktopStreamStatusMessage,\n} from \"./desktop-stream.ts\";\n\nexport type {\n SandboxAgentHealthWaitOptions,\n AgentQueryOptions,\n DesktopStreamSessionOptions,\n ProcessLogFollowQuery,\n ProcessLogListener,\n ProcessLogSubscription,\n ProcessTerminalConnectOptions,\n ProcessTerminalSessionOptions,\n ProcessTerminalWebSocketUrlOptions,\n SandboxAgentConnectOptions,\n SandboxAgentStartOptions,\n SessionCreateRequest,\n SessionResumeOrCreateRequest,\n SessionSendOptions,\n SessionEventListener,\n PermissionReply,\n PermissionRequestListener,\n SessionPermissionRequest,\n SessionPermissionRequestOption,\n} from \"./client.ts\";\n\nexport type { InspectorUrlOptions } from \"./inspector.ts\";\n\nexport { InMemorySessionPersistDriver } from \"./types.ts\";\nexport type { SandboxProvider } from \"./providers/types.ts\";\n\nexport type {\n AcpEnvelope,\n AcpServerInfo,\n AcpServerListResponse,\n AgentInfo,\n AgentQuery,\n AgentInstallRequest,\n AgentInstallResponse,\n AgentListResponse,\n DesktopActionResponse,\n DesktopDisplayInfoResponse,\n DesktopErrorInfo,\n DesktopKeyboardDownRequest,\n DesktopKeyboardUpRequest,\n DesktopKeyModifiers,\n DesktopKeyboardPressRequest,\n DesktopKeyboardTypeRequest,\n DesktopMouseButton,\n DesktopMouseClickRequest,\n DesktopMouseDownRequest,\n DesktopMouseDragRequest,\n DesktopMouseMoveRequest,\n DesktopMousePositionResponse,\n DesktopMouseScrollRequest,\n DesktopMouseUpRequest,\n DesktopProcessInfo,\n DesktopRecordingInfo,\n DesktopRecordingListResponse,\n DesktopRecordingStartRequest,\n DesktopRecordingStatus,\n DesktopRegionScreenshotQuery,\n DesktopResolution,\n DesktopScreenshotFormat,\n DesktopScreenshotQuery,\n DesktopStartRequest,\n DesktopState,\n DesktopStatusResponse,\n DesktopStreamStatusResponse,\n DesktopWindowInfo,\n DesktopWindowListResponse,\n FsActionResponse,\n FsDeleteQuery,\n FsEntriesQuery,\n FsEntry,\n FsMoveRequest,\n FsMoveResponse,\n FsPathQuery,\n FsStat,\n FsUploadBatchQuery,\n FsUploadBatchResponse,\n FsWriteResponse,\n HealthResponse,\n InMemorySessionPersistDriverOptions,\n ListEventsRequest,\n ListPage,\n ListPageRequest,\n McpConfigQuery,\n McpServerConfig,\n ProblemDetails,\n ProcessConfig,\n ProcessCreateRequest,\n ProcessInfo,\n ProcessInputRequest,\n ProcessInputResponse,\n ProcessListQuery,\n ProcessListResponse,\n ProcessLogEntry,\n ProcessLogsQuery,\n ProcessLogsResponse,\n ProcessOwner,\n ProcessLogsStream,\n ProcessRunRequest,\n ProcessRunResponse,\n ProcessSignalQuery,\n ProcessState,\n ProcessTerminalClientFrame,\n ProcessTerminalErrorFrame,\n ProcessTerminalExitFrame,\n ProcessTerminalReadyFrame,\n ProcessTerminalResizeRequest,\n ProcessTerminalResizeResponse,\n ProcessTerminalServerFrame,\n SessionEvent,\n SessionPersistDriver,\n SessionRecord,\n SkillsConfig,\n SkillsConfigQuery,\n TerminalErrorStatus,\n TerminalExitStatus,\n TerminalReadyStatus,\n TerminalResizePayload,\n TerminalStatusMessage,\n} from \"./types.ts\";\n\nexport type {\n SandboxAgentSpawnLogMode,\n SandboxAgentSpawnOptions,\n} from \"./spawn.ts\";\n","export interface InspectorUrlOptions {\n /**\n * Base URL of the sandbox-agent server.\n */\n baseUrl: string;\n /**\n * Optional bearer token for authentication.\n */\n token?: string;\n /**\n * Optional extra headers to pass to the sandbox-agent server.\n * Will be JSON-encoded in the URL.\n */\n headers?: Record<string, string>;\n}\n\n/**\n * Builds a URL to the sandbox-agent inspector UI with the given connection parameters.\n * The inspector UI is served at /ui/ on the sandbox-agent server.\n */\nexport function buildInspectorUrl(options: InspectorUrlOptions): string {\n const normalized = options.baseUrl.replace(/\\/+$/, \"\");\n const params = new URLSearchParams();\n if (options.token) {\n params.set(\"token\", options.token);\n }\n if (options.headers && Object.keys(options.headers).length > 0) {\n params.set(\"headers\", JSON.stringify(options.headers));\n }\n const queryString = params.toString();\n return `${normalized}/ui/${queryString ? `?${queryString}` : \"\"}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaA,SAAS,mBAAmB;;;ACOrB,SAAS,kBAAkB,SAAsC;AACtE,QAAM,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACrD,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,QAAQ,OAAO;AACjB,WAAO,IAAI,SAAS,QAAQ,KAAK;AAAA,EACnC;AACA,MAAI,QAAQ,WAAW,OAAO,KAAK,QAAQ,OAAO,EAAE,SAAS,GAAG;AAC9D,WAAO,IAAI,WAAW,KAAK,UAAU,QAAQ,OAAO,CAAC;AAAA,EACvD;AACA,QAAM,cAAc,OAAO,SAAS;AACpC,SAAO,GAAG,UAAU,OAAO,cAAc,IAAI,WAAW,KAAK,EAAE;AACjE;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/inspector.ts"],"sourcesContent":["export {\n LiveAcpConnection,\n ProcessTerminalSession,\n SandboxAgent,\n SandboxAgentError,\n SandboxDestroyedError,\n Session,\n UnsupportedPermissionReplyError,\n UnsupportedSessionCategoryError,\n UnsupportedSessionConfigOptionError,\n UnsupportedSessionValueError,\n} from \"./client.ts\";\n\nexport { AcpRpcError } from \"acp-http-client\";\n\nexport { buildInspectorUrl } from \"./inspector.ts\";\nexport { DesktopStreamSession } from \"./desktop-stream.ts\";\nexport type {\n DesktopStreamConnectOptions,\n DesktopStreamErrorStatus,\n DesktopStreamReadyStatus,\n DesktopStreamStatusMessage,\n} from \"./desktop-stream.ts\";\n\nexport type {\n SandboxAgentHealthWaitOptions,\n AgentQueryOptions,\n DesktopStreamSessionOptions,\n ProcessLogFollowQuery,\n ProcessLogListener,\n ProcessLogSubscription,\n ProcessTerminalConnectOptions,\n ProcessTerminalSessionOptions,\n ProcessTerminalWebSocketUrlOptions,\n SandboxAgentConnectOptions,\n SandboxAgentStartOptions,\n SessionCreateRequest,\n SessionResumeOrCreateRequest,\n SessionSendOptions,\n SessionEventListener,\n PermissionReply,\n PermissionRequestListener,\n SessionPermissionRequest,\n SessionPermissionRequestOption,\n} from \"./client.ts\";\n\nexport type { InspectorUrlOptions } from \"./inspector.ts\";\n\nexport { InMemorySessionPersistDriver } from \"./types.ts\";\nexport type { SandboxProvider } from \"./providers/types.ts\";\n\nexport type {\n AcpEnvelope,\n AcpServerInfo,\n AcpServerListResponse,\n AgentInfo,\n AgentQuery,\n AgentInstallRequest,\n AgentInstallResponse,\n AgentListResponse,\n DesktopActionResponse,\n DesktopDisplayInfoResponse,\n DesktopErrorInfo,\n DesktopKeyboardDownRequest,\n DesktopKeyboardUpRequest,\n DesktopKeyModifiers,\n DesktopKeyboardPressRequest,\n DesktopKeyboardTypeRequest,\n DesktopMouseButton,\n DesktopMouseClickRequest,\n DesktopMouseDownRequest,\n DesktopMouseDragRequest,\n DesktopMouseMoveRequest,\n DesktopMousePositionResponse,\n DesktopMouseScrollRequest,\n DesktopMouseUpRequest,\n DesktopProcessInfo,\n DesktopRecordingInfo,\n DesktopRecordingListResponse,\n DesktopRecordingStartRequest,\n DesktopRecordingStatus,\n DesktopRegionScreenshotQuery,\n DesktopResolution,\n DesktopScreenshotFormat,\n DesktopScreenshotQuery,\n DesktopStartRequest,\n DesktopState,\n DesktopStatusResponse,\n DesktopStreamStatusResponse,\n DesktopWindowInfo,\n DesktopWindowListResponse,\n FsActionResponse,\n FsDeleteQuery,\n FsEntriesQuery,\n FsEntry,\n FsMoveRequest,\n FsMoveResponse,\n FsPathQuery,\n FsStat,\n FsUploadBatchQuery,\n FsUploadBatchResponse,\n FsWriteResponse,\n HealthResponse,\n InMemorySessionPersistDriverOptions,\n ListEventsRequest,\n ListPage,\n ListPageRequest,\n McpConfigQuery,\n McpServerConfig,\n ProblemDetails,\n ProcessConfig,\n ProcessCreateRequest,\n ProcessInfo,\n ProcessInputRequest,\n ProcessInputResponse,\n ProcessListQuery,\n ProcessListResponse,\n ProcessLogEntry,\n ProcessLogsQuery,\n ProcessLogsResponse,\n ProcessOwner,\n ProcessLogsStream,\n ProcessRunRequest,\n ProcessRunResponse,\n ProcessSignalQuery,\n ProcessState,\n ProcessTerminalClientFrame,\n ProcessTerminalErrorFrame,\n ProcessTerminalExitFrame,\n ProcessTerminalReadyFrame,\n ProcessTerminalResizeRequest,\n ProcessTerminalResizeResponse,\n ProcessTerminalServerFrame,\n SessionEvent,\n SessionPersistDriver,\n SessionRecord,\n SkillsConfig,\n SkillsConfigQuery,\n TerminalErrorStatus,\n TerminalExitStatus,\n TerminalReadyStatus,\n TerminalResizePayload,\n TerminalStatusMessage,\n} from \"./types.ts\";\n\nexport type {\n SandboxAgentSpawnLogMode,\n SandboxAgentSpawnOptions,\n} from \"./spawn.ts\";\n\nexport type {\n SpritesProviderOptions,\n SpritesCreateOverrides,\n SpritesClientOverrides,\n} from \"./providers/sprites.ts\";\n","export interface InspectorUrlOptions {\n /**\n * Base URL of the sandbox-agent server.\n */\n baseUrl: string;\n /**\n * Optional bearer token for authentication.\n */\n token?: string;\n /**\n * Optional extra headers to pass to the sandbox-agent server.\n * Will be JSON-encoded in the URL.\n */\n headers?: Record<string, string>;\n}\n\n/**\n * Builds a URL to the sandbox-agent inspector UI with the given connection parameters.\n * The inspector UI is served at /ui/ on the sandbox-agent server.\n */\nexport function buildInspectorUrl(options: InspectorUrlOptions): string {\n const normalized = options.baseUrl.replace(/\\/+$/, \"\");\n const params = new URLSearchParams();\n if (options.token) {\n params.set(\"token\", options.token);\n }\n if (options.headers && Object.keys(options.headers).length > 0) {\n params.set(\"headers\", JSON.stringify(options.headers));\n }\n const queryString = params.toString();\n return `${normalized}/ui/${queryString ? `?${queryString}` : \"\"}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaA,SAAS,mBAAmB;;;ACOrB,SAAS,kBAAkB,SAAsC;AACtE,QAAM,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACrD,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,QAAQ,OAAO;AACjB,WAAO,IAAI,SAAS,QAAQ,KAAK;AAAA,EACnC;AACA,MAAI,QAAQ,WAAW,OAAO,KAAK,QAAQ,OAAO,EAAE,SAAS,GAAG;AAC9D,WAAO,IAAI,WAAW,KAAK,UAAU,QAAQ,OAAO,CAAC;AAAA,EACvD;AACA,QAAM,cAAc,OAAO,SAAS;AACpC,SAAO,GAAG,UAAU,OAAO,cAAc,IAAI,WAAW,KAAK,EAAE;AACjE;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { S as SandboxProvider } from '../types--QirRZeL.js';
|
|
2
|
+
|
|
3
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
4
|
+
interface AgentComputerCreateOverrides {
|
|
5
|
+
handle?: string;
|
|
6
|
+
displayName?: string;
|
|
7
|
+
runtimeFamily?: string;
|
|
8
|
+
sourceKind?: string;
|
|
9
|
+
imageFamily?: string;
|
|
10
|
+
imageRef?: string;
|
|
11
|
+
sourceRepoUrl?: string;
|
|
12
|
+
sourceRef?: string;
|
|
13
|
+
sourceCommitSha?: string;
|
|
14
|
+
sourceSubpath?: string;
|
|
15
|
+
primaryPort?: number;
|
|
16
|
+
primaryPath?: string;
|
|
17
|
+
healthcheckType?: string;
|
|
18
|
+
healthcheckValue?: string;
|
|
19
|
+
sshEnabled?: boolean;
|
|
20
|
+
vncEnabled?: boolean;
|
|
21
|
+
workspaceName?: string;
|
|
22
|
+
usePlatformDefault?: boolean;
|
|
23
|
+
idea?: string;
|
|
24
|
+
initialPrompt?: string;
|
|
25
|
+
}
|
|
26
|
+
interface AgentComputerProviderOptions {
|
|
27
|
+
apiKey?: string | (() => MaybePromise<string>);
|
|
28
|
+
apiUrl?: string;
|
|
29
|
+
fetch?: typeof globalThis.fetch;
|
|
30
|
+
create?: AgentComputerCreateOverrides | (() => MaybePromise<AgentComputerCreateOverrides>);
|
|
31
|
+
pollIntervalMs?: number;
|
|
32
|
+
startTimeoutMs?: number;
|
|
33
|
+
defaultCwd?: string;
|
|
34
|
+
}
|
|
35
|
+
declare function agentcomputer(options?: AgentComputerProviderOptions): SandboxProvider;
|
|
36
|
+
|
|
37
|
+
export { type AgentComputerCreateOverrides, type AgentComputerProviderOptions, agentcomputer };
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SandboxDestroyedError
|
|
3
|
+
} from "../chunk-TEHINGEG.js";
|
|
4
|
+
|
|
5
|
+
// src/providers/agentcomputer.ts
|
|
6
|
+
var DEFAULT_API_URL = process.env.COMPUTER_API_URL ?? process.env.AGENTCOMPUTER_API_URL ?? "https://api.computer.agentcomputer.ai";
|
|
7
|
+
var DEFAULT_POLL_INTERVAL_MS = 1500;
|
|
8
|
+
var DEFAULT_START_TIMEOUT_MS = 3e5;
|
|
9
|
+
var DEFAULT_CWD = "/home/node";
|
|
10
|
+
var BROWSER_ACCESS_REFRESH_SKEW_MS = 3e4;
|
|
11
|
+
var BROWSER_SESSION_COOKIE = "agentcomputer_access_session";
|
|
12
|
+
var READY_STATUSES = /* @__PURE__ */ new Set(["starting", "running"]);
|
|
13
|
+
var FAILED_STATUSES = /* @__PURE__ */ new Set(["deleted", "error", "stopped", "stopping"]);
|
|
14
|
+
var AgentComputerApiError = class extends Error {
|
|
15
|
+
status;
|
|
16
|
+
constructor(status, message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "AgentComputerApiError";
|
|
19
|
+
this.status = status;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
async function resolveApiKey(value) {
|
|
23
|
+
const raw = typeof value === "function" ? await value() : value ?? process.env.COMPUTER_API_KEY ?? process.env.AGENTCOMPUTER_API_KEY ?? "";
|
|
24
|
+
const apiKey = raw.trim();
|
|
25
|
+
if (!apiKey) {
|
|
26
|
+
throw new Error("agentcomputer provider requires an API key. Set COMPUTER_API_KEY (or AGENTCOMPUTER_API_KEY) or pass `apiKey`.");
|
|
27
|
+
}
|
|
28
|
+
return apiKey;
|
|
29
|
+
}
|
|
30
|
+
async function resolveCreateOptions(value) {
|
|
31
|
+
if (!value) {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
return typeof value === "function" ? await value() : value;
|
|
35
|
+
}
|
|
36
|
+
function resolveFetch(fetcher) {
|
|
37
|
+
const resolved = fetcher ?? globalThis.fetch?.bind(globalThis);
|
|
38
|
+
if (!resolved) {
|
|
39
|
+
throw new Error("Fetch API is not available; provide a fetch implementation.");
|
|
40
|
+
}
|
|
41
|
+
return resolved;
|
|
42
|
+
}
|
|
43
|
+
function normalizeApiUrl(url) {
|
|
44
|
+
return url.replace(/\/+$/, "");
|
|
45
|
+
}
|
|
46
|
+
function serializeCreateOptions(options) {
|
|
47
|
+
return {
|
|
48
|
+
handle: options.handle,
|
|
49
|
+
display_name: options.displayName,
|
|
50
|
+
runtime_family: options.runtimeFamily,
|
|
51
|
+
source_kind: options.sourceKind,
|
|
52
|
+
image_family: options.imageFamily,
|
|
53
|
+
image_ref: options.imageRef,
|
|
54
|
+
source_repo_url: options.sourceRepoUrl,
|
|
55
|
+
source_ref: options.sourceRef,
|
|
56
|
+
source_commit_sha: options.sourceCommitSha,
|
|
57
|
+
source_subpath: options.sourceSubpath,
|
|
58
|
+
primary_port: options.primaryPort,
|
|
59
|
+
primary_path: options.primaryPath,
|
|
60
|
+
healthcheck_type: options.healthcheckType,
|
|
61
|
+
healthcheck_value: options.healthcheckValue,
|
|
62
|
+
ssh_enabled: options.sshEnabled,
|
|
63
|
+
vnc_enabled: options.vncEnabled,
|
|
64
|
+
workspace_name: options.workspaceName,
|
|
65
|
+
use_platform_default: options.usePlatformDefault,
|
|
66
|
+
idea: options.idea,
|
|
67
|
+
initial_prompt: options.initialPrompt
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async function readErrorMessage(response) {
|
|
71
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
72
|
+
if (contentType.includes("application/json")) {
|
|
73
|
+
try {
|
|
74
|
+
const payload = await response.json();
|
|
75
|
+
if (payload.error) {
|
|
76
|
+
return payload.error;
|
|
77
|
+
}
|
|
78
|
+
return JSON.stringify(payload);
|
|
79
|
+
} catch {
|
|
80
|
+
return response.statusText || "request failed";
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const body = await response.text();
|
|
84
|
+
return body || response.statusText || "request failed";
|
|
85
|
+
}
|
|
86
|
+
function isNotFoundError(error) {
|
|
87
|
+
return error instanceof AgentComputerApiError && error.status === 404;
|
|
88
|
+
}
|
|
89
|
+
function isFailedStatus(status) {
|
|
90
|
+
return !!status && FAILED_STATUSES.has(status);
|
|
91
|
+
}
|
|
92
|
+
function isReadyStatus(status) {
|
|
93
|
+
return !!status && READY_STATUSES.has(status);
|
|
94
|
+
}
|
|
95
|
+
function formatComputerStatusError(sandboxId, computer) {
|
|
96
|
+
const status = computer.status ?? "unknown";
|
|
97
|
+
if (status === "deleted") {
|
|
98
|
+
return new SandboxDestroyedError(sandboxId, "agentcomputer");
|
|
99
|
+
}
|
|
100
|
+
const suffix = computer.last_error ? `: ${computer.last_error}` : "";
|
|
101
|
+
return new Error(`agentcomputer computer '${sandboxId}' is not available (status '${status}'${suffix}).`);
|
|
102
|
+
}
|
|
103
|
+
function sleep(ms) {
|
|
104
|
+
if (ms <= 0) {
|
|
105
|
+
return Promise.resolve();
|
|
106
|
+
}
|
|
107
|
+
return new Promise((resolve) => {
|
|
108
|
+
setTimeout(resolve, ms);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function mergeCookieHeader(existingCookie, name, value) {
|
|
112
|
+
if (!existingCookie?.trim()) {
|
|
113
|
+
return `${name}=${value}`;
|
|
114
|
+
}
|
|
115
|
+
return `${existingCookie}; ${name}=${value}`;
|
|
116
|
+
}
|
|
117
|
+
function isAuthRedirect(response) {
|
|
118
|
+
if (response.status < 300 || response.status >= 400) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const location = response.headers.get("location") ?? "";
|
|
122
|
+
return location.includes("/login") || location.includes("auth_required") || location.includes("machine_unauthorized");
|
|
123
|
+
}
|
|
124
|
+
function parseBrowserAccess(accessUrl, expiresAtRaw) {
|
|
125
|
+
const url = new URL(accessUrl);
|
|
126
|
+
const accessToken = url.searchParams.get("access_token") ?? url.searchParams.get("token") ?? "";
|
|
127
|
+
if (!accessToken) {
|
|
128
|
+
throw new Error("agentcomputer browser access response did not include an access token.");
|
|
129
|
+
}
|
|
130
|
+
const inspectorUrl = new URL(accessUrl);
|
|
131
|
+
inspectorUrl.pathname = "/ui/";
|
|
132
|
+
const expiresAt = Date.parse(expiresAtRaw ?? "");
|
|
133
|
+
return {
|
|
134
|
+
accessToken,
|
|
135
|
+
inspectorUrl: inspectorUrl.toString(),
|
|
136
|
+
expiresAt: Number.isFinite(expiresAt) ? expiresAt : 0
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function shouldRefreshBrowserAccess(state) {
|
|
140
|
+
if (!state) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
return state.expiresAt <= Date.now() + BROWSER_ACCESS_REFRESH_SKEW_MS;
|
|
144
|
+
}
|
|
145
|
+
function agentcomputer(options = {}) {
|
|
146
|
+
const apiUrl = normalizeApiUrl(options.apiUrl ?? DEFAULT_API_URL);
|
|
147
|
+
const fetcher = resolveFetch(options.fetch);
|
|
148
|
+
const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
149
|
+
const startTimeoutMs = options.startTimeoutMs ?? DEFAULT_START_TIMEOUT_MS;
|
|
150
|
+
const defaultCwd = options.defaultCwd ?? DEFAULT_CWD;
|
|
151
|
+
const connectionUrlBySandbox = /* @__PURE__ */ new Map();
|
|
152
|
+
const browserAccessBySandbox = /* @__PURE__ */ new Map();
|
|
153
|
+
const readySandboxes = /* @__PURE__ */ new Set();
|
|
154
|
+
async function apiRequest(path, init, allowNotFound = false) {
|
|
155
|
+
const headers = new Headers(init?.headers);
|
|
156
|
+
if (!headers.has("accept")) {
|
|
157
|
+
headers.set("accept", "application/json");
|
|
158
|
+
}
|
|
159
|
+
if (init?.body !== void 0 && !headers.has("content-type")) {
|
|
160
|
+
headers.set("content-type", "application/json");
|
|
161
|
+
}
|
|
162
|
+
headers.set("authorization", `Bearer ${await resolveApiKey(options.apiKey)}`);
|
|
163
|
+
const response = await fetcher(`${apiUrl}${path}`, {
|
|
164
|
+
...init,
|
|
165
|
+
headers
|
|
166
|
+
});
|
|
167
|
+
if (!response.ok) {
|
|
168
|
+
if (allowNotFound && response.status === 404) {
|
|
169
|
+
return void 0;
|
|
170
|
+
}
|
|
171
|
+
throw new AgentComputerApiError(response.status, await readErrorMessage(response));
|
|
172
|
+
}
|
|
173
|
+
if (response.status === 204) {
|
|
174
|
+
return void 0;
|
|
175
|
+
}
|
|
176
|
+
return await response.json();
|
|
177
|
+
}
|
|
178
|
+
async function getComputer(sandboxId, allowNotFound = false) {
|
|
179
|
+
return await apiRequest(`/v1/computers/${encodeURIComponent(sandboxId)}`, void 0, allowNotFound);
|
|
180
|
+
}
|
|
181
|
+
async function waitUntilBrowserReady(sandboxId) {
|
|
182
|
+
if (readySandboxes.has(sandboxId)) {
|
|
183
|
+
return { id: sandboxId, status: "running" };
|
|
184
|
+
}
|
|
185
|
+
const startedAt = Date.now();
|
|
186
|
+
while (true) {
|
|
187
|
+
const computer = await getComputer(sandboxId, true);
|
|
188
|
+
if (!computer) {
|
|
189
|
+
throw new SandboxDestroyedError(sandboxId, "agentcomputer");
|
|
190
|
+
}
|
|
191
|
+
if (isReadyStatus(computer.status)) {
|
|
192
|
+
readySandboxes.add(sandboxId);
|
|
193
|
+
return computer;
|
|
194
|
+
}
|
|
195
|
+
if (isFailedStatus(computer.status)) {
|
|
196
|
+
readySandboxes.delete(sandboxId);
|
|
197
|
+
throw formatComputerStatusError(sandboxId, computer);
|
|
198
|
+
}
|
|
199
|
+
if (Date.now() - startedAt >= startTimeoutMs) {
|
|
200
|
+
throw new Error(`agentcomputer computer '${sandboxId}' did not become browser-ready within ${startTimeoutMs}ms.`);
|
|
201
|
+
}
|
|
202
|
+
await sleep(pollIntervalMs);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async function getConnectionUrl(sandboxId) {
|
|
206
|
+
const cached = connectionUrlBySandbox.get(sandboxId);
|
|
207
|
+
if (cached) {
|
|
208
|
+
return cached;
|
|
209
|
+
}
|
|
210
|
+
const response = await apiRequest(`/v1/computers/${encodeURIComponent(sandboxId)}/connection`);
|
|
211
|
+
const webUrl = response?.connection?.web_url?.trim();
|
|
212
|
+
if (!webUrl) {
|
|
213
|
+
throw new Error(`agentcomputer connection info did not return a web_url for '${sandboxId}'.`);
|
|
214
|
+
}
|
|
215
|
+
connectionUrlBySandbox.set(sandboxId, webUrl);
|
|
216
|
+
return webUrl;
|
|
217
|
+
}
|
|
218
|
+
async function mintBrowserAccess(sandboxId) {
|
|
219
|
+
await waitUntilBrowserReady(sandboxId);
|
|
220
|
+
const response = await apiRequest(`/v1/computers/${encodeURIComponent(sandboxId)}/access/browser`, {
|
|
221
|
+
method: "POST"
|
|
222
|
+
});
|
|
223
|
+
const accessUrl = response?.access_url?.trim();
|
|
224
|
+
if (!accessUrl) {
|
|
225
|
+
throw new Error(`agentcomputer browser access did not return an access_url for '${sandboxId}'.`);
|
|
226
|
+
}
|
|
227
|
+
const state = parseBrowserAccess(accessUrl, response?.expires_at);
|
|
228
|
+
browserAccessBySandbox.set(sandboxId, state);
|
|
229
|
+
return state;
|
|
230
|
+
}
|
|
231
|
+
async function ensureBrowserAccess(sandboxId) {
|
|
232
|
+
const cached = browserAccessBySandbox.get(sandboxId);
|
|
233
|
+
if (!shouldRefreshBrowserAccess(cached)) {
|
|
234
|
+
return cached;
|
|
235
|
+
}
|
|
236
|
+
return await mintBrowserAccess(sandboxId);
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
name: "agentcomputer",
|
|
240
|
+
defaultCwd,
|
|
241
|
+
async create() {
|
|
242
|
+
const createOptions = await resolveCreateOptions(options.create);
|
|
243
|
+
const computer = await apiRequest("/v1/computers", {
|
|
244
|
+
method: "POST",
|
|
245
|
+
body: JSON.stringify(
|
|
246
|
+
serializeCreateOptions({
|
|
247
|
+
runtimeFamily: "managed-worker",
|
|
248
|
+
usePlatformDefault: true,
|
|
249
|
+
...createOptions
|
|
250
|
+
})
|
|
251
|
+
)
|
|
252
|
+
});
|
|
253
|
+
if (!computer?.id) {
|
|
254
|
+
throw new Error("agentcomputer create response did not return a computer id.");
|
|
255
|
+
}
|
|
256
|
+
await waitUntilBrowserReady(computer.id);
|
|
257
|
+
return computer.id;
|
|
258
|
+
},
|
|
259
|
+
async destroy(sandboxId) {
|
|
260
|
+
browserAccessBySandbox.delete(sandboxId);
|
|
261
|
+
connectionUrlBySandbox.delete(sandboxId);
|
|
262
|
+
readySandboxes.delete(sandboxId);
|
|
263
|
+
await apiRequest(`/v1/computers/${encodeURIComponent(sandboxId)}`, { method: "DELETE" }, true);
|
|
264
|
+
},
|
|
265
|
+
async reconnect(sandboxId) {
|
|
266
|
+
try {
|
|
267
|
+
const computer = await getComputer(sandboxId, true);
|
|
268
|
+
if (!computer) {
|
|
269
|
+
throw new SandboxDestroyedError(sandboxId, "agentcomputer");
|
|
270
|
+
}
|
|
271
|
+
if (isReadyStatus(computer.status)) {
|
|
272
|
+
readySandboxes.add(sandboxId);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (isFailedStatus(computer.status)) {
|
|
276
|
+
readySandboxes.delete(sandboxId);
|
|
277
|
+
throw formatComputerStatusError(sandboxId, computer);
|
|
278
|
+
}
|
|
279
|
+
} catch (error) {
|
|
280
|
+
if (isNotFoundError(error)) {
|
|
281
|
+
throw new SandboxDestroyedError(sandboxId, "agentcomputer", { cause: error });
|
|
282
|
+
}
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
async getUrl(sandboxId) {
|
|
287
|
+
return await getConnectionUrl(sandboxId);
|
|
288
|
+
},
|
|
289
|
+
async getFetch(sandboxId) {
|
|
290
|
+
return async (input, init) => {
|
|
291
|
+
const request = new Request(input, init);
|
|
292
|
+
const sandboxOrigin = new URL(await getConnectionUrl(sandboxId)).origin;
|
|
293
|
+
const requestOrigin = new URL(request.url, sandboxOrigin).origin;
|
|
294
|
+
if (requestOrigin !== sandboxOrigin) {
|
|
295
|
+
return await fetcher(request);
|
|
296
|
+
}
|
|
297
|
+
const browserAccess = await ensureBrowserAccess(sandboxId);
|
|
298
|
+
const headers = new Headers(request.headers);
|
|
299
|
+
headers.set("cookie", mergeCookieHeader(headers.get("cookie"), BROWSER_SESSION_COOKIE, browserAccess.accessToken));
|
|
300
|
+
const response = await fetcher(new Request(request, { headers, redirect: "manual" }));
|
|
301
|
+
if (response.status === 401 || isAuthRedirect(response)) {
|
|
302
|
+
browserAccessBySandbox.delete(sandboxId);
|
|
303
|
+
}
|
|
304
|
+
return response;
|
|
305
|
+
};
|
|
306
|
+
},
|
|
307
|
+
async getInspectorUrl(sandboxId) {
|
|
308
|
+
const browserAccess = await ensureBrowserAccess(sandboxId);
|
|
309
|
+
return browserAccess.inspectorUrl;
|
|
310
|
+
},
|
|
311
|
+
async ensureServer() {
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
export {
|
|
316
|
+
agentcomputer
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=agentcomputer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/providers/agentcomputer.ts"],"sourcesContent":["import { SandboxDestroyedError } from \"../client.ts\";\nimport type { SandboxProvider } from \"./types.ts\";\n\nconst DEFAULT_API_URL = process.env.COMPUTER_API_URL ?? process.env.AGENTCOMPUTER_API_URL ?? \"https://api.computer.agentcomputer.ai\";\nconst DEFAULT_POLL_INTERVAL_MS = 1_500;\nconst DEFAULT_START_TIMEOUT_MS = 300_000;\nconst DEFAULT_CWD = \"/home/node\";\nconst BROWSER_ACCESS_REFRESH_SKEW_MS = 30_000;\nconst BROWSER_SESSION_COOKIE = \"agentcomputer_access_session\";\n\nconst READY_STATUSES = new Set([\"starting\", \"running\"]);\nconst FAILED_STATUSES = new Set([\"deleted\", \"error\", \"stopped\", \"stopping\"]);\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport interface AgentComputerCreateOverrides {\n handle?: string;\n displayName?: string;\n runtimeFamily?: string;\n sourceKind?: string;\n imageFamily?: string;\n imageRef?: string;\n sourceRepoUrl?: string;\n sourceRef?: string;\n sourceCommitSha?: string;\n sourceSubpath?: string;\n primaryPort?: number;\n primaryPath?: string;\n healthcheckType?: string;\n healthcheckValue?: string;\n sshEnabled?: boolean;\n vncEnabled?: boolean;\n workspaceName?: string;\n usePlatformDefault?: boolean;\n idea?: string;\n initialPrompt?: string;\n}\n\nexport interface AgentComputerProviderOptions {\n apiKey?: string | (() => MaybePromise<string>);\n apiUrl?: string;\n fetch?: typeof globalThis.fetch;\n create?: AgentComputerCreateOverrides | (() => MaybePromise<AgentComputerCreateOverrides>);\n pollIntervalMs?: number;\n startTimeoutMs?: number;\n defaultCwd?: string;\n}\n\ninterface AgentComputerComputer {\n id: string;\n status?: string;\n last_error?: string;\n}\n\ninterface AgentComputerConnectionResponse {\n connection?: {\n web_url?: string;\n };\n}\n\ninterface AgentComputerBrowserAccessResponse {\n access_url?: string;\n expires_at?: string;\n}\n\ninterface BrowserAccessState {\n accessToken: string;\n inspectorUrl: string;\n expiresAt: number;\n}\n\nclass AgentComputerApiError extends Error {\n readonly status: number;\n\n constructor(status: number, message: string) {\n super(message);\n this.name = \"AgentComputerApiError\";\n this.status = status;\n }\n}\n\nasync function resolveApiKey(value: AgentComputerProviderOptions[\"apiKey\"]): Promise<string> {\n const raw = typeof value === \"function\" ? await value() : (value ?? process.env.COMPUTER_API_KEY ?? process.env.AGENTCOMPUTER_API_KEY ?? \"\");\n const apiKey = raw.trim();\n if (!apiKey) {\n throw new Error(\"agentcomputer provider requires an API key. Set COMPUTER_API_KEY (or AGENTCOMPUTER_API_KEY) or pass `apiKey`.\");\n }\n return apiKey;\n}\n\nasync function resolveCreateOptions(value: AgentComputerProviderOptions[\"create\"]): Promise<AgentComputerCreateOverrides> {\n if (!value) {\n return {};\n }\n return typeof value === \"function\" ? await value() : value;\n}\n\nfunction resolveFetch(fetcher: AgentComputerProviderOptions[\"fetch\"]): typeof globalThis.fetch {\n const resolved = fetcher ?? globalThis.fetch?.bind(globalThis);\n if (!resolved) {\n throw new Error(\"Fetch API is not available; provide a fetch implementation.\");\n }\n return resolved;\n}\n\nfunction normalizeApiUrl(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\nfunction serializeCreateOptions(options: AgentComputerCreateOverrides): Record<string, unknown> {\n return {\n handle: options.handle,\n display_name: options.displayName,\n runtime_family: options.runtimeFamily,\n source_kind: options.sourceKind,\n image_family: options.imageFamily,\n image_ref: options.imageRef,\n source_repo_url: options.sourceRepoUrl,\n source_ref: options.sourceRef,\n source_commit_sha: options.sourceCommitSha,\n source_subpath: options.sourceSubpath,\n primary_port: options.primaryPort,\n primary_path: options.primaryPath,\n healthcheck_type: options.healthcheckType,\n healthcheck_value: options.healthcheckValue,\n ssh_enabled: options.sshEnabled,\n vnc_enabled: options.vncEnabled,\n workspace_name: options.workspaceName,\n use_platform_default: options.usePlatformDefault,\n idea: options.idea,\n initial_prompt: options.initialPrompt,\n };\n}\n\nasync function readErrorMessage(response: Response): Promise<string> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n try {\n const payload = (await response.json()) as { error?: string };\n if (payload.error) {\n return payload.error;\n }\n return JSON.stringify(payload);\n } catch {\n return response.statusText || \"request failed\";\n }\n }\n\n const body = await response.text();\n return body || response.statusText || \"request failed\";\n}\n\nfunction isNotFoundError(error: unknown): error is AgentComputerApiError {\n return error instanceof AgentComputerApiError && error.status === 404;\n}\n\nfunction isFailedStatus(status: string | undefined): boolean {\n return !!status && FAILED_STATUSES.has(status);\n}\n\nfunction isReadyStatus(status: string | undefined): boolean {\n return !!status && READY_STATUSES.has(status);\n}\n\nfunction formatComputerStatusError(sandboxId: string, computer: AgentComputerComputer): Error {\n const status = computer.status ?? \"unknown\";\n if (status === \"deleted\") {\n return new SandboxDestroyedError(sandboxId, \"agentcomputer\");\n }\n const suffix = computer.last_error ? `: ${computer.last_error}` : \"\";\n return new Error(`agentcomputer computer '${sandboxId}' is not available (status '${status}'${suffix}).`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n if (ms <= 0) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction mergeCookieHeader(existingCookie: string | null, name: string, value: string): string {\n if (!existingCookie?.trim()) {\n return `${name}=${value}`;\n }\n return `${existingCookie}; ${name}=${value}`;\n}\n\nfunction isAuthRedirect(response: Response): boolean {\n if (response.status < 300 || response.status >= 400) {\n return false;\n }\n const location = response.headers.get(\"location\") ?? \"\";\n return location.includes(\"/login\") || location.includes(\"auth_required\") || location.includes(\"machine_unauthorized\");\n}\n\nfunction parseBrowserAccess(accessUrl: string, expiresAtRaw: string | undefined): BrowserAccessState {\n const url = new URL(accessUrl);\n const accessToken = url.searchParams.get(\"access_token\") ?? url.searchParams.get(\"token\") ?? \"\";\n if (!accessToken) {\n throw new Error(\"agentcomputer browser access response did not include an access token.\");\n }\n\n const inspectorUrl = new URL(accessUrl);\n inspectorUrl.pathname = \"/ui/\";\n\n const expiresAt = Date.parse(expiresAtRaw ?? \"\");\n return {\n accessToken,\n inspectorUrl: inspectorUrl.toString(),\n expiresAt: Number.isFinite(expiresAt) ? expiresAt : 0,\n };\n}\n\nfunction shouldRefreshBrowserAccess(state: BrowserAccessState | undefined): boolean {\n if (!state) {\n return true;\n }\n return state.expiresAt <= Date.now() + BROWSER_ACCESS_REFRESH_SKEW_MS;\n}\n\nexport function agentcomputer(options: AgentComputerProviderOptions = {}): SandboxProvider {\n const apiUrl = normalizeApiUrl(options.apiUrl ?? DEFAULT_API_URL);\n const fetcher = resolveFetch(options.fetch);\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const startTimeoutMs = options.startTimeoutMs ?? DEFAULT_START_TIMEOUT_MS;\n const defaultCwd = options.defaultCwd ?? DEFAULT_CWD;\n const connectionUrlBySandbox = new Map<string, string>();\n const browserAccessBySandbox = new Map<string, BrowserAccessState>();\n const readySandboxes = new Set<string>();\n\n async function apiRequest<T>(path: string, init?: RequestInit, allowNotFound = false): Promise<T | undefined> {\n const headers = new Headers(init?.headers);\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\");\n }\n if (init?.body !== undefined && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n headers.set(\"authorization\", `Bearer ${await resolveApiKey(options.apiKey)}`);\n\n const response = await fetcher(`${apiUrl}${path}`, {\n ...init,\n headers,\n });\n\n if (!response.ok) {\n if (allowNotFound && response.status === 404) {\n return undefined;\n }\n throw new AgentComputerApiError(response.status, await readErrorMessage(response));\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n }\n\n async function getComputer(sandboxId: string, allowNotFound = false): Promise<AgentComputerComputer | undefined> {\n return await apiRequest<AgentComputerComputer>(`/v1/computers/${encodeURIComponent(sandboxId)}`, undefined, allowNotFound);\n }\n\n async function waitUntilBrowserReady(sandboxId: string): Promise<AgentComputerComputer> {\n if (readySandboxes.has(sandboxId)) {\n return { id: sandboxId, status: \"running\" };\n }\n\n const startedAt = Date.now();\n\n while (true) {\n const computer = await getComputer(sandboxId, true);\n if (!computer) {\n throw new SandboxDestroyedError(sandboxId, \"agentcomputer\");\n }\n if (isReadyStatus(computer.status)) {\n readySandboxes.add(sandboxId);\n return computer;\n }\n if (isFailedStatus(computer.status)) {\n readySandboxes.delete(sandboxId);\n throw formatComputerStatusError(sandboxId, computer);\n }\n if (Date.now() - startedAt >= startTimeoutMs) {\n throw new Error(`agentcomputer computer '${sandboxId}' did not become browser-ready within ${startTimeoutMs}ms.`);\n }\n await sleep(pollIntervalMs);\n }\n }\n\n async function getConnectionUrl(sandboxId: string): Promise<string> {\n const cached = connectionUrlBySandbox.get(sandboxId);\n if (cached) {\n return cached;\n }\n\n const response = await apiRequest<AgentComputerConnectionResponse>(`/v1/computers/${encodeURIComponent(sandboxId)}/connection`);\n const webUrl = response?.connection?.web_url?.trim();\n if (!webUrl) {\n throw new Error(`agentcomputer connection info did not return a web_url for '${sandboxId}'.`);\n }\n\n connectionUrlBySandbox.set(sandboxId, webUrl);\n return webUrl;\n }\n\n async function mintBrowserAccess(sandboxId: string): Promise<BrowserAccessState> {\n await waitUntilBrowserReady(sandboxId);\n const response = await apiRequest<AgentComputerBrowserAccessResponse>(`/v1/computers/${encodeURIComponent(sandboxId)}/access/browser`, {\n method: \"POST\",\n });\n const accessUrl = response?.access_url?.trim();\n if (!accessUrl) {\n throw new Error(`agentcomputer browser access did not return an access_url for '${sandboxId}'.`);\n }\n const state = parseBrowserAccess(accessUrl, response?.expires_at);\n browserAccessBySandbox.set(sandboxId, state);\n return state;\n }\n\n async function ensureBrowserAccess(sandboxId: string): Promise<BrowserAccessState> {\n const cached = browserAccessBySandbox.get(sandboxId);\n if (!shouldRefreshBrowserAccess(cached)) {\n return cached!;\n }\n return await mintBrowserAccess(sandboxId);\n }\n\n return {\n name: \"agentcomputer\",\n defaultCwd,\n async create(): Promise<string> {\n const createOptions = await resolveCreateOptions(options.create);\n const computer = await apiRequest<AgentComputerComputer>(\"/v1/computers\", {\n method: \"POST\",\n body: JSON.stringify(\n serializeCreateOptions({\n runtimeFamily: \"managed-worker\",\n usePlatformDefault: true,\n ...createOptions,\n }),\n ),\n });\n\n if (!computer?.id) {\n throw new Error(\"agentcomputer create response did not return a computer id.\");\n }\n\n await waitUntilBrowserReady(computer.id);\n return computer.id;\n },\n async destroy(sandboxId: string): Promise<void> {\n browserAccessBySandbox.delete(sandboxId);\n connectionUrlBySandbox.delete(sandboxId);\n readySandboxes.delete(sandboxId);\n await apiRequest<void>(`/v1/computers/${encodeURIComponent(sandboxId)}`, { method: \"DELETE\" }, true);\n },\n async reconnect(sandboxId: string): Promise<void> {\n try {\n const computer = await getComputer(sandboxId, true);\n if (!computer) {\n throw new SandboxDestroyedError(sandboxId, \"agentcomputer\");\n }\n if (isReadyStatus(computer.status)) {\n readySandboxes.add(sandboxId);\n return;\n }\n if (isFailedStatus(computer.status)) {\n readySandboxes.delete(sandboxId);\n throw formatComputerStatusError(sandboxId, computer);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n throw new SandboxDestroyedError(sandboxId, \"agentcomputer\", { cause: error });\n }\n throw error;\n }\n },\n async getUrl(sandboxId: string): Promise<string> {\n return await getConnectionUrl(sandboxId);\n },\n async getFetch(sandboxId: string): Promise<typeof globalThis.fetch> {\n return async (input, init) => {\n const request = new Request(input, init);\n const sandboxOrigin = new URL(await getConnectionUrl(sandboxId)).origin;\n const requestOrigin = new URL(request.url, sandboxOrigin).origin;\n if (requestOrigin !== sandboxOrigin) {\n return await fetcher(request);\n }\n\n const browserAccess = await ensureBrowserAccess(sandboxId);\n const headers = new Headers(request.headers);\n headers.set(\"cookie\", mergeCookieHeader(headers.get(\"cookie\"), BROWSER_SESSION_COOKIE, browserAccess.accessToken));\n\n const response = await fetcher(new Request(request, { headers, redirect: \"manual\" }));\n if (response.status === 401 || isAuthRedirect(response)) {\n browserAccessBySandbox.delete(sandboxId);\n }\n return response;\n };\n },\n async getInspectorUrl(sandboxId: string): Promise<string> {\n const browserAccess = await ensureBrowserAccess(sandboxId);\n return browserAccess.inspectorUrl;\n },\n async ensureServer(): Promise<void> {\n // Managed-worker images already boot sandbox-agent and expose health on /v1/health.\n },\n };\n}\n"],"mappings":";;;;;AAGA,IAAM,kBAAkB,QAAQ,IAAI,oBAAoB,QAAQ,IAAI,yBAAyB;AAC7F,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AACjC,IAAM,cAAc;AACpB,IAAM,iCAAiC;AACvC,IAAM,yBAAyB;AAE/B,IAAM,iBAAiB,oBAAI,IAAI,CAAC,YAAY,SAAS,CAAC;AACtD,IAAM,kBAAkB,oBAAI,IAAI,CAAC,WAAW,SAAS,WAAW,UAAU,CAAC;AA4D3E,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/B;AAAA,EAET,YAAY,QAAgB,SAAiB;AAC3C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEA,eAAe,cAAc,OAAgE;AAC3F,QAAM,MAAM,OAAO,UAAU,aAAa,MAAM,MAAM,IAAK,SAAS,QAAQ,IAAI,oBAAoB,QAAQ,IAAI,yBAAyB;AACzI,QAAM,SAAS,IAAI,KAAK;AACxB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,+GAA+G;AAAA,EACjI;AACA,SAAO;AACT;AAEA,eAAe,qBAAqB,OAAsF;AACxH,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,UAAU,aAAa,MAAM,MAAM,IAAI;AACvD;AAEA,SAAS,aAAa,SAAyE;AAC7F,QAAM,WAAW,WAAW,WAAW,OAAO,KAAK,UAAU;AAC7D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,SAAO,IAAI,QAAQ,QAAQ,EAAE;AAC/B;AAEA,SAAS,uBAAuB,SAAgE;AAC9F,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,gBAAgB,QAAQ;AAAA,IACxB,aAAa,QAAQ;AAAA,IACrB,cAAc,QAAQ;AAAA,IACtB,WAAW,QAAQ;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,YAAY,QAAQ;AAAA,IACpB,mBAAmB,QAAQ;AAAA,IAC3B,gBAAgB,QAAQ;AAAA,IACxB,cAAc,QAAQ;AAAA,IACtB,cAAc,QAAQ;AAAA,IACtB,kBAAkB,QAAQ;AAAA,IAC1B,mBAAmB,QAAQ;AAAA,IAC3B,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,gBAAgB,QAAQ;AAAA,IACxB,sBAAsB,QAAQ;AAAA,IAC9B,MAAM,QAAQ;AAAA,IACd,gBAAgB,QAAQ;AAAA,EAC1B;AACF;AAEA,eAAe,iBAAiB,UAAqC;AACnE,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,MAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,QAAI;AACF,YAAM,UAAW,MAAM,SAAS,KAAK;AACrC,UAAI,QAAQ,OAAO;AACjB,eAAO,QAAQ;AAAA,MACjB;AACA,aAAO,KAAK,UAAU,OAAO;AAAA,IAC/B,QAAQ;AACN,aAAO,SAAS,cAAc;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,QAAQ,SAAS,cAAc;AACxC;AAEA,SAAS,gBAAgB,OAAgD;AACvE,SAAO,iBAAiB,yBAAyB,MAAM,WAAW;AACpE;AAEA,SAAS,eAAe,QAAqC;AAC3D,SAAO,CAAC,CAAC,UAAU,gBAAgB,IAAI,MAAM;AAC/C;AAEA,SAAS,cAAc,QAAqC;AAC1D,SAAO,CAAC,CAAC,UAAU,eAAe,IAAI,MAAM;AAC9C;AAEA,SAAS,0BAA0B,WAAmB,UAAwC;AAC5F,QAAM,SAAS,SAAS,UAAU;AAClC,MAAI,WAAW,WAAW;AACxB,WAAO,IAAI,sBAAsB,WAAW,eAAe;AAAA,EAC7D;AACA,QAAM,SAAS,SAAS,aAAa,KAAK,SAAS,UAAU,KAAK;AAClE,SAAO,IAAI,MAAM,2BAA2B,SAAS,+BAA+B,MAAM,IAAI,MAAM,IAAI;AAC1G;AAEA,SAAS,MAAM,IAA2B;AACxC,MAAI,MAAM,GAAG;AACX,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,kBAAkB,gBAA+B,MAAc,OAAuB;AAC7F,MAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,WAAO,GAAG,IAAI,IAAI,KAAK;AAAA,EACzB;AACA,SAAO,GAAG,cAAc,KAAK,IAAI,IAAI,KAAK;AAC5C;AAEA,SAAS,eAAe,UAA6B;AACnD,MAAI,SAAS,SAAS,OAAO,SAAS,UAAU,KAAK;AACnD,WAAO;AAAA,EACT;AACA,QAAM,WAAW,SAAS,QAAQ,IAAI,UAAU,KAAK;AACrD,SAAO,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,eAAe,KAAK,SAAS,SAAS,sBAAsB;AACtH;AAEA,SAAS,mBAAmB,WAAmB,cAAsD;AACnG,QAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,QAAM,cAAc,IAAI,aAAa,IAAI,cAAc,KAAK,IAAI,aAAa,IAAI,OAAO,KAAK;AAC7F,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC1F;AAEA,QAAM,eAAe,IAAI,IAAI,SAAS;AACtC,eAAa,WAAW;AAExB,QAAM,YAAY,KAAK,MAAM,gBAAgB,EAAE;AAC/C,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa,SAAS;AAAA,IACpC,WAAW,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,EACtD;AACF;AAEA,SAAS,2BAA2B,OAAgD;AAClF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,MAAM,aAAa,KAAK,IAAI,IAAI;AACzC;AAEO,SAAS,cAAc,UAAwC,CAAC,GAAoB;AACzF,QAAM,SAAS,gBAAgB,QAAQ,UAAU,eAAe;AAChE,QAAM,UAAU,aAAa,QAAQ,KAAK;AAC1C,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,yBAAyB,oBAAI,IAAoB;AACvD,QAAM,yBAAyB,oBAAI,IAAgC;AACnE,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,iBAAe,WAAc,MAAc,MAAoB,gBAAgB,OAA+B;AAC5G,UAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,QAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG;AAC1B,cAAQ,IAAI,UAAU,kBAAkB;AAAA,IAC1C;AACA,QAAI,MAAM,SAAS,UAAa,CAAC,QAAQ,IAAI,cAAc,GAAG;AAC5D,cAAQ,IAAI,gBAAgB,kBAAkB;AAAA,IAChD;AACA,YAAQ,IAAI,iBAAiB,UAAU,MAAM,cAAc,QAAQ,MAAM,CAAC,EAAE;AAE5E,UAAM,WAAW,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,IAAI;AAAA,MACjD,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,iBAAiB,SAAS,WAAW,KAAK;AAC5C,eAAO;AAAA,MACT;AACA,YAAM,IAAI,sBAAsB,SAAS,QAAQ,MAAM,iBAAiB,QAAQ,CAAC;AAAA,IACnF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAEA,iBAAe,YAAY,WAAmB,gBAAgB,OAAmD;AAC/G,WAAO,MAAM,WAAkC,iBAAiB,mBAAmB,SAAS,CAAC,IAAI,QAAW,aAAa;AAAA,EAC3H;AAEA,iBAAe,sBAAsB,WAAmD;AACtF,QAAI,eAAe,IAAI,SAAS,GAAG;AACjC,aAAO,EAAE,IAAI,WAAW,QAAQ,UAAU;AAAA,IAC5C;AAEA,UAAM,YAAY,KAAK,IAAI;AAE3B,WAAO,MAAM;AACX,YAAM,WAAW,MAAM,YAAY,WAAW,IAAI;AAClD,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,sBAAsB,WAAW,eAAe;AAAA,MAC5D;AACA,UAAI,cAAc,SAAS,MAAM,GAAG;AAClC,uBAAe,IAAI,SAAS;AAC5B,eAAO;AAAA,MACT;AACA,UAAI,eAAe,SAAS,MAAM,GAAG;AACnC,uBAAe,OAAO,SAAS;AAC/B,cAAM,0BAA0B,WAAW,QAAQ;AAAA,MACrD;AACA,UAAI,KAAK,IAAI,IAAI,aAAa,gBAAgB;AAC5C,cAAM,IAAI,MAAM,2BAA2B,SAAS,yCAAyC,cAAc,KAAK;AAAA,MAClH;AACA,YAAM,MAAM,cAAc;AAAA,IAC5B;AAAA,EACF;AAEA,iBAAe,iBAAiB,WAAoC;AAClE,UAAM,SAAS,uBAAuB,IAAI,SAAS;AACnD,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,WAA4C,iBAAiB,mBAAmB,SAAS,CAAC,aAAa;AAC9H,UAAM,SAAS,UAAU,YAAY,SAAS,KAAK;AACnD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,+DAA+D,SAAS,IAAI;AAAA,IAC9F;AAEA,2BAAuB,IAAI,WAAW,MAAM;AAC5C,WAAO;AAAA,EACT;AAEA,iBAAe,kBAAkB,WAAgD;AAC/E,UAAM,sBAAsB,SAAS;AACrC,UAAM,WAAW,MAAM,WAA+C,iBAAiB,mBAAmB,SAAS,CAAC,mBAAmB;AAAA,MACrI,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,YAAY,UAAU,YAAY,KAAK;AAC7C,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,kEAAkE,SAAS,IAAI;AAAA,IACjG;AACA,UAAM,QAAQ,mBAAmB,WAAW,UAAU,UAAU;AAChE,2BAAuB,IAAI,WAAW,KAAK;AAC3C,WAAO;AAAA,EACT;AAEA,iBAAe,oBAAoB,WAAgD;AACjF,UAAM,SAAS,uBAAuB,IAAI,SAAS;AACnD,QAAI,CAAC,2BAA2B,MAAM,GAAG;AACvC,aAAO;AAAA,IACT;AACA,WAAO,MAAM,kBAAkB,SAAS;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,MAAM,SAA0B;AAC9B,YAAM,gBAAgB,MAAM,qBAAqB,QAAQ,MAAM;AAC/D,YAAM,WAAW,MAAM,WAAkC,iBAAiB;AAAA,QACxE,QAAQ;AAAA,QACR,MAAM,KAAK;AAAA,UACT,uBAAuB;AAAA,YACrB,eAAe;AAAA,YACf,oBAAoB;AAAA,YACpB,GAAG;AAAA,UACL,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,UAAI,CAAC,UAAU,IAAI;AACjB,cAAM,IAAI,MAAM,6DAA6D;AAAA,MAC/E;AAEA,YAAM,sBAAsB,SAAS,EAAE;AACvC,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,MAAM,QAAQ,WAAkC;AAC9C,6BAAuB,OAAO,SAAS;AACvC,6BAAuB,OAAO,SAAS;AACvC,qBAAe,OAAO,SAAS;AAC/B,YAAM,WAAiB,iBAAiB,mBAAmB,SAAS,CAAC,IAAI,EAAE,QAAQ,SAAS,GAAG,IAAI;AAAA,IACrG;AAAA,IACA,MAAM,UAAU,WAAkC;AAChD,UAAI;AACF,cAAM,WAAW,MAAM,YAAY,WAAW,IAAI;AAClD,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,sBAAsB,WAAW,eAAe;AAAA,QAC5D;AACA,YAAI,cAAc,SAAS,MAAM,GAAG;AAClC,yBAAe,IAAI,SAAS;AAC5B;AAAA,QACF;AACA,YAAI,eAAe,SAAS,MAAM,GAAG;AACnC,yBAAe,OAAO,SAAS;AAC/B,gBAAM,0BAA0B,WAAW,QAAQ;AAAA,QACrD;AAAA,MACF,SAAS,OAAO;AACd,YAAI,gBAAgB,KAAK,GAAG;AAC1B,gBAAM,IAAI,sBAAsB,WAAW,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAAA,QAC9E;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM,OAAO,WAAoC;AAC/C,aAAO,MAAM,iBAAiB,SAAS;AAAA,IACzC;AAAA,IACA,MAAM,SAAS,WAAqD;AAClE,aAAO,OAAO,OAAO,SAAS;AAC5B,cAAM,UAAU,IAAI,QAAQ,OAAO,IAAI;AACvC,cAAM,gBAAgB,IAAI,IAAI,MAAM,iBAAiB,SAAS,CAAC,EAAE;AACjE,cAAM,gBAAgB,IAAI,IAAI,QAAQ,KAAK,aAAa,EAAE;AAC1D,YAAI,kBAAkB,eAAe;AACnC,iBAAO,MAAM,QAAQ,OAAO;AAAA,QAC9B;AAEA,cAAM,gBAAgB,MAAM,oBAAoB,SAAS;AACzD,cAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;AAC3C,gBAAQ,IAAI,UAAU,kBAAkB,QAAQ,IAAI,QAAQ,GAAG,wBAAwB,cAAc,WAAW,CAAC;AAEjH,cAAM,WAAW,MAAM,QAAQ,IAAI,QAAQ,SAAS,EAAE,SAAS,UAAU,SAAS,CAAC,CAAC;AACpF,YAAI,SAAS,WAAW,OAAO,eAAe,QAAQ,GAAG;AACvD,iCAAuB,OAAO,SAAS;AAAA,QACzC;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,gBAAgB,WAAoC;AACxD,YAAM,gBAAgB,MAAM,oBAAoB,SAAS;AACzD,aAAO,cAAc;AAAA,IACvB;AAAA,IACA,MAAM,eAA8B;AAAA,IAEpC;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CreateSandboxOptions } from 'computesdk';
|
|
2
|
-
import { S as SandboxProvider } from '../types
|
|
2
|
+
import { S as SandboxProvider } from '../types--QirRZeL.js';
|
|
3
3
|
|
|
4
4
|
type ComputeCreateOverrides = Partial<CreateSandboxOptions>;
|
|
5
5
|
interface ComputeSdkProviderOptions {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Daytona } from '@daytonaio/sdk';
|
|
2
|
-
import { S as SandboxProvider } from '../types
|
|
2
|
+
import { S as SandboxProvider } from '../types--QirRZeL.js';
|
|
3
3
|
|
|
4
4
|
type DaytonaCreateParams = NonNullable<Parameters<Daytona["create"]>[0]>;
|
|
5
5
|
type DaytonaCreateOverrides = Partial<DaytonaCreateParams>;
|
|
@@ -7,6 +7,7 @@ interface DaytonaProviderOptions {
|
|
|
7
7
|
create?: DaytonaCreateOverrides | (() => DaytonaCreateOverrides | Promise<DaytonaCreateOverrides>);
|
|
8
8
|
image?: DaytonaCreateParams["image"];
|
|
9
9
|
agentPort?: number;
|
|
10
|
+
cwd?: string;
|
|
10
11
|
previewTtlSeconds?: number;
|
|
11
12
|
deleteTimeoutSeconds?: number;
|
|
12
13
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DEFAULT_SANDBOX_AGENT_IMAGE,
|
|
3
3
|
buildServerStartCommand
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-7BNDCDDU.js";
|
|
5
5
|
|
|
6
6
|
// src/providers/daytona.ts
|
|
7
7
|
import { Daytona } from "@daytonaio/sdk";
|
|
8
8
|
var DEFAULT_AGENT_PORT = 3e3;
|
|
9
9
|
var DEFAULT_PREVIEW_TTL_SECONDS = 4 * 60 * 60;
|
|
10
|
+
var DEFAULT_CWD = "/home/sandbox";
|
|
10
11
|
async function resolveCreateOptions(value) {
|
|
11
12
|
if (!value) return void 0;
|
|
12
13
|
if (typeof value === "function") return await value();
|
|
@@ -15,11 +16,12 @@ async function resolveCreateOptions(value) {
|
|
|
15
16
|
function daytona(options = {}) {
|
|
16
17
|
const agentPort = options.agentPort ?? DEFAULT_AGENT_PORT;
|
|
17
18
|
const image = options.image ?? DEFAULT_SANDBOX_AGENT_IMAGE;
|
|
19
|
+
const cwd = options.cwd ?? DEFAULT_CWD;
|
|
18
20
|
const previewTtlSeconds = options.previewTtlSeconds ?? DEFAULT_PREVIEW_TTL_SECONDS;
|
|
19
21
|
const client = new Daytona();
|
|
20
22
|
return {
|
|
21
23
|
name: "daytona",
|
|
22
|
-
defaultCwd:
|
|
24
|
+
defaultCwd: cwd,
|
|
23
25
|
async create() {
|
|
24
26
|
const createOpts = await resolveCreateOptions(options.create);
|
|
25
27
|
const sandbox = await client.create({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/daytona.ts"],"sourcesContent":["import { Daytona } from \"@daytonaio/sdk\";\nimport type { SandboxProvider } from \"./types.ts\";\nimport { DEFAULT_SANDBOX_AGENT_IMAGE, buildServerStartCommand } from \"./shared.ts\";\n\nconst DEFAULT_AGENT_PORT = 3000;\nconst DEFAULT_PREVIEW_TTL_SECONDS = 4 * 60 * 60;\n\ntype DaytonaCreateParams = NonNullable<Parameters<Daytona[\"create\"]>[0]>;\n\ntype DaytonaCreateOverrides = Partial<DaytonaCreateParams>;\n\nexport interface DaytonaProviderOptions {\n create?: DaytonaCreateOverrides | (() => DaytonaCreateOverrides | Promise<DaytonaCreateOverrides>);\n image?: DaytonaCreateParams[\"image\"];\n agentPort?: number;\n previewTtlSeconds?: number;\n deleteTimeoutSeconds?: number;\n}\n\nasync function resolveCreateOptions(value: DaytonaProviderOptions[\"create\"]): Promise<DaytonaCreateOverrides | undefined> {\n if (!value) return undefined;\n if (typeof value === \"function\") return await value();\n return value;\n}\n\nexport function daytona(options: DaytonaProviderOptions = {}): SandboxProvider {\n const agentPort = options.agentPort ?? DEFAULT_AGENT_PORT;\n const image = options.image ?? DEFAULT_SANDBOX_AGENT_IMAGE;\n const previewTtlSeconds = options.previewTtlSeconds ?? DEFAULT_PREVIEW_TTL_SECONDS;\n const client = new Daytona();\n\n return {\n name: \"daytona\",\n defaultCwd:
|
|
1
|
+
{"version":3,"sources":["../../src/providers/daytona.ts"],"sourcesContent":["import { Daytona } from \"@daytonaio/sdk\";\nimport type { SandboxProvider } from \"./types.ts\";\nimport { DEFAULT_SANDBOX_AGENT_IMAGE, buildServerStartCommand } from \"./shared.ts\";\n\nconst DEFAULT_AGENT_PORT = 3000;\nconst DEFAULT_PREVIEW_TTL_SECONDS = 4 * 60 * 60;\nconst DEFAULT_CWD = \"/home/sandbox\";\n\ntype DaytonaCreateParams = NonNullable<Parameters<Daytona[\"create\"]>[0]>;\n\ntype DaytonaCreateOverrides = Partial<DaytonaCreateParams>;\n\nexport interface DaytonaProviderOptions {\n create?: DaytonaCreateOverrides | (() => DaytonaCreateOverrides | Promise<DaytonaCreateOverrides>);\n image?: DaytonaCreateParams[\"image\"];\n agentPort?: number;\n cwd?: string;\n previewTtlSeconds?: number;\n deleteTimeoutSeconds?: number;\n}\n\nasync function resolveCreateOptions(value: DaytonaProviderOptions[\"create\"]): Promise<DaytonaCreateOverrides | undefined> {\n if (!value) return undefined;\n if (typeof value === \"function\") return await value();\n return value;\n}\n\nexport function daytona(options: DaytonaProviderOptions = {}): SandboxProvider {\n const agentPort = options.agentPort ?? DEFAULT_AGENT_PORT;\n const image = options.image ?? DEFAULT_SANDBOX_AGENT_IMAGE;\n const cwd = options.cwd ?? DEFAULT_CWD;\n const previewTtlSeconds = options.previewTtlSeconds ?? DEFAULT_PREVIEW_TTL_SECONDS;\n const client = new Daytona();\n\n return {\n name: \"daytona\",\n defaultCwd: cwd,\n async create(): Promise<string> {\n const createOpts = await resolveCreateOptions(options.create);\n const sandbox = await client.create({\n image,\n autoStopInterval: 0,\n ...createOpts,\n } as DaytonaCreateParams);\n await sandbox.process.executeCommand(buildServerStartCommand(agentPort));\n return sandbox.id;\n },\n async destroy(sandboxId: string): Promise<void> {\n const sandbox = await client.get(sandboxId);\n if (!sandbox) {\n return;\n }\n await sandbox.delete(options.deleteTimeoutSeconds);\n },\n async getUrl(sandboxId: string): Promise<string> {\n const sandbox = await client.get(sandboxId);\n if (!sandbox) {\n throw new Error(`daytona sandbox not found: ${sandboxId}`);\n }\n const preview = await sandbox.getSignedPreviewUrl(agentPort, previewTtlSeconds);\n return typeof preview === \"string\" ? preview : preview.url;\n },\n async ensureServer(sandboxId: string): Promise<void> {\n const sandbox = await client.get(sandboxId);\n if (!sandbox) {\n throw new Error(`daytona sandbox not found: ${sandboxId}`);\n }\n await sandbox.process.executeCommand(buildServerStartCommand(agentPort));\n },\n };\n}\n"],"mappings":";;;;;;AAAA,SAAS,eAAe;AAIxB,IAAM,qBAAqB;AAC3B,IAAM,8BAA8B,IAAI,KAAK;AAC7C,IAAM,cAAc;AAepB,eAAe,qBAAqB,OAAsF;AACxH,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,OAAO,UAAU,WAAY,QAAO,MAAM,MAAM;AACpD,SAAO;AACT;AAEO,SAAS,QAAQ,UAAkC,CAAC,GAAoB;AAC7E,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,oBAAoB,QAAQ,qBAAqB;AACvD,QAAM,SAAS,IAAI,QAAQ;AAE3B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM,SAA0B;AAC9B,YAAM,aAAa,MAAM,qBAAqB,QAAQ,MAAM;AAC5D,YAAM,UAAU,MAAM,OAAO,OAAO;AAAA,QAClC;AAAA,QACA,kBAAkB;AAAA,QAClB,GAAG;AAAA,MACL,CAAwB;AACxB,YAAM,QAAQ,QAAQ,eAAe,wBAAwB,SAAS,CAAC;AACvE,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,MAAM,QAAQ,WAAkC;AAC9C,YAAM,UAAU,MAAM,OAAO,IAAI,SAAS;AAC1C,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AACA,YAAM,QAAQ,OAAO,QAAQ,oBAAoB;AAAA,IACnD;AAAA,IACA,MAAM,OAAO,WAAoC;AAC/C,YAAM,UAAU,MAAM,OAAO,IAAI,SAAS;AAC1C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE;AAAA,MAC3D;AACA,YAAM,UAAU,MAAM,QAAQ,oBAAoB,WAAW,iBAAiB;AAC9E,aAAO,OAAO,YAAY,WAAW,UAAU,QAAQ;AAAA,IACzD;AAAA,IACA,MAAM,aAAa,WAAkC;AACnD,YAAM,UAAU,MAAM,OAAO,IAAI,SAAS;AAC1C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE;AAAA,MAC3D;AACA,YAAM,QAAQ,QAAQ,eAAe,wBAAwB,SAAS,CAAC;AAAA,IACzE;AAAA,EACF;AACF;","names":[]}
|
package/dist/providers/docker.js
CHANGED
package/dist/providers/e2b.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SandboxBetaCreateOpts, SandboxConnectOpts } from '@e2b/code-interpreter';
|
|
2
|
-
import { S as SandboxProvider } from '../types
|
|
2
|
+
import { S as SandboxProvider } from '../types--QirRZeL.js';
|
|
3
3
|
|
|
4
4
|
type E2BCreateOverrides = Omit<Partial<SandboxBetaCreateOpts>, "timeoutMs" | "autoPause">;
|
|
5
5
|
type E2BConnectOverrides = Omit<Partial<SandboxConnectOpts>, "timeoutMs">;
|