diff --git a/src/client.ts b/src/client.ts index 5325859..43c8a49 100644 --- a/src/client.ts +++ b/src/client.ts @@ -12,6 +12,7 @@ import { HyperAgentService } from "./services/agents/hyper-agent"; import { TeamService } from "./services/team"; import { ComputerActionService } from "./services/computer-action"; import { GeminiComputerUseService } from "./services/agents/gemini-computer-use"; +import { TaskService } from "./services/agents/task"; import { WebService } from "./services/web"; import { SandboxesService } from "./services/sandboxes"; import { VolumesService } from "./services/volumes"; @@ -67,6 +68,7 @@ export class HyperbrowserClient { cua: CuaService; hyperAgent: HyperAgentService; geminiComputerUse: GeminiComputerUseService; + task: TaskService; }; public readonly team: TeamService; public readonly computerAction: ComputerActionService; @@ -102,6 +104,7 @@ export class HyperbrowserClient { cua: new CuaService(apiKey, baseUrl, timeout), hyperAgent: new HyperAgentService(apiKey, baseUrl, timeout), geminiComputerUse: new GeminiComputerUseService(apiKey, baseUrl, timeout), + task: new TaskService(apiKey, baseUrl, timeout), }; } } diff --git a/src/services/agents/base.ts b/src/services/agents/base.ts new file mode 100644 index 0000000..6cef8a7 --- /dev/null +++ b/src/services/agents/base.ts @@ -0,0 +1,23 @@ +import { HyperbrowserError } from "../../client"; +import { AgentTaskListParams, AgentTaskListResponse } from "../../types/agents/task"; +import { BaseService } from "../base"; + +export abstract class AgentTaskListService extends BaseService { + protected abstract readonly taskPath: string; + protected abstract readonly taskLabel: string; + + async list(params: AgentTaskListParams = {}): Promise { + try { + return await this.request(`/task/${this.taskPath}`, undefined, { + task: params.task, + page: params.page, + limit: params.limit, + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to list ${this.taskLabel} task jobs`, undefined); + } + } +} diff --git a/src/services/agents/browser-use.ts b/src/services/agents/browser-use.ts index c95f01e..fa76184 100644 --- a/src/services/agents/browser-use.ts +++ b/src/services/agents/browser-use.ts @@ -10,9 +10,12 @@ import { BrowserUseTaskStatusResponse, } from "../../types/agents/browser-use"; import { isZodSchema, sleep } from "../../utils"; -import { BaseService } from "../base"; +import { AgentTaskListService } from "./base"; + +export class BrowserUseService extends AgentTaskListService { + protected readonly taskPath = "browser-use"; + protected readonly taskLabel = "browser-use"; -export class BrowserUseService extends BaseService { /** * Start a new browser-use task job * @param params The parameters for the task job diff --git a/src/services/agents/claude-computer-use.ts b/src/services/agents/claude-computer-use.ts index 874d981..8339316 100644 --- a/src/services/agents/claude-computer-use.ts +++ b/src/services/agents/claude-computer-use.ts @@ -2,7 +2,7 @@ import { HyperbrowserError } from "../../client"; import { BasicResponse } from "../../types"; import { POLLING_ATTEMPTS } from "../../types/constants"; import { sleep } from "../../utils"; -import { BaseService } from "../base"; +import { AgentTaskListService } from "./base"; import { ClaudeComputerUseTaskResponse, ClaudeComputerUseTaskStatusResponse, @@ -10,7 +10,10 @@ import { StartClaudeComputerUseTaskResponse, } from "../../types/agents/claude-computer-use"; -export class ClaudeComputerUseService extends BaseService { +export class ClaudeComputerUseService extends AgentTaskListService { + protected readonly taskPath = "claude-computer-use"; + protected readonly taskLabel = "claude-computer-use"; + /** * Start a new Claude Computer Use task job * @param params The parameters for the task job diff --git a/src/services/agents/cua.ts b/src/services/agents/cua.ts index cb2080b..cef7fcc 100644 --- a/src/services/agents/cua.ts +++ b/src/services/agents/cua.ts @@ -2,7 +2,7 @@ import { HyperbrowserError } from "../../client"; import { BasicResponse } from "../../types"; import { POLLING_ATTEMPTS } from "../../types/constants"; import { sleep } from "../../utils"; -import { BaseService } from "../base"; +import { AgentTaskListService } from "./base"; import { CuaTaskResponse, CuaTaskStatusResponse, @@ -10,7 +10,10 @@ import { StartCuaTaskResponse, } from "../../types/agents/cua"; -export class CuaService extends BaseService { +export class CuaService extends AgentTaskListService { + protected readonly taskPath = "cua"; + protected readonly taskLabel = "cua"; + /** * Start a new CUA task job * @param params The parameters for the task job diff --git a/src/services/agents/gemini-computer-use.ts b/src/services/agents/gemini-computer-use.ts index 48c5bcc..b1ff845 100644 --- a/src/services/agents/gemini-computer-use.ts +++ b/src/services/agents/gemini-computer-use.ts @@ -2,7 +2,7 @@ import { HyperbrowserError } from "../../client"; import { BasicResponse } from "../../types"; import { POLLING_ATTEMPTS } from "../../types/constants"; import { sleep } from "../../utils"; -import { BaseService } from "../base"; +import { AgentTaskListService } from "./base"; import { GeminiComputerUseTaskResponse, GeminiComputerUseTaskStatusResponse, @@ -10,7 +10,10 @@ import { StartGeminiComputerUseTaskResponse, } from "../../types/agents/gemini-computer-use"; -export class GeminiComputerUseService extends BaseService { +export class GeminiComputerUseService extends AgentTaskListService { + protected readonly taskPath = "gemini-computer-use"; + protected readonly taskLabel = "gemini-computer-use"; + /** * Start a new Gemini Computer Use task job * @param params The parameters for the task job diff --git a/src/services/agents/hyper-agent.ts b/src/services/agents/hyper-agent.ts index 4edfe65..ccc0e45 100644 --- a/src/services/agents/hyper-agent.ts +++ b/src/services/agents/hyper-agent.ts @@ -2,7 +2,7 @@ import { HyperbrowserError } from "../../client"; import { BasicResponse } from "../../types"; import { POLLING_ATTEMPTS } from "../../types/constants"; import { sleep } from "../../utils"; -import { BaseService } from "../base"; +import { AgentTaskListService } from "./base"; import { HyperAgentTaskResponse, HyperAgentTaskStatusResponse, @@ -10,7 +10,10 @@ import { StartHyperAgentTaskResponse, } from "../../types/agents/hyper-agent"; -export class HyperAgentService extends BaseService { +export class HyperAgentService extends AgentTaskListService { + protected readonly taskPath = "hyper-agent"; + protected readonly taskLabel = "hyper-agent"; + /** * Start a new HyperAgent task job * @param params The parameters for the task job diff --git a/src/services/agents/task.ts b/src/services/agents/task.ts new file mode 100644 index 0000000..58e8692 --- /dev/null +++ b/src/services/agents/task.ts @@ -0,0 +1,87 @@ +import { HyperbrowserError } from "../../client"; +import { BasicResponse } from "../../types"; +import { POLLING_ATTEMPTS } from "../../types/constants"; +import { + StartTaskParams, + StartTaskResponse, + TaskResponse, + TaskStatusResponse, +} from "../../types/agents/task"; +import { sleep } from "../../utils"; +import { BaseService } from "../base"; + +export class TaskService extends BaseService { + async start(params: StartTaskParams): Promise { + try { + return await this.request("/task", { + method: "POST", + body: JSON.stringify(params), + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError("Failed to start task job", undefined); + } + } + + async getStatus(id: string): Promise { + try { + return await this.request(`/task/${id}/status`); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get task job ${id} status`, undefined); + } + } + + async get(id: string): Promise { + try { + return await this.request(`/task/${id}`); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get task job ${id}`, undefined); + } + } + + async stop(id: string): Promise { + try { + return await this.request(`/task/${id}/stop`, { method: "PUT" }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to stop task job ${id}`, undefined); + } + } + + async startAndWait(params: StartTaskParams): Promise { + const jobStartResp = await this.start(params); + const jobId = jobStartResp.jobId; + if (!jobId) { + throw new HyperbrowserError("Failed to start task job"); + } + + let failures = 0; + while (true) { + try { + const jobResponse = await this.getStatus(jobId); + if (["completed", "failed", "stopped"].includes(jobResponse.status)) { + return await this.get(jobId); + } + failures = 0; + } catch (error) { + failures++; + if (failures >= POLLING_ATTEMPTS) { + throw new HyperbrowserError( + `Failed to poll task job ${jobId} after ${POLLING_ATTEMPTS} attempts: ${error}` + ); + } + } + await sleep(2000); + } + } +} diff --git a/src/services/profiles.ts b/src/services/profiles.ts index 0ac49a6..2c56916 100644 --- a/src/services/profiles.ts +++ b/src/services/profiles.ts @@ -3,6 +3,8 @@ import { CreateProfileParams, ProfileResponse, CreateProfileResponse, + UpdateProfileParams, + BatchDeleteProfilesParams, ProfileListParams, ProfileListResponse, } from "../types/profile"; @@ -60,6 +62,44 @@ export class ProfilesService extends BaseService { } } + + /** + * Update an existing profile + * @param id The ID of the profile to update + * @param params Profile fields to update + */ + async update(id: string, params: UpdateProfileParams): Promise { + try { + return await this.request(`/profile/${id}`, { + method: "PUT", + body: JSON.stringify(params), + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to update profile ${id}`, undefined); + } + } + + /** + * Delete multiple profiles + * @param params Profile IDs to delete + */ + async deleteMany(params: BatchDeleteProfilesParams): Promise { + try { + return await this.request("/profiles", { + method: "DELETE", + body: JSON.stringify(params), + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError("Failed to delete profiles", undefined); + } + } + /** * List all profiles with optional pagination * @param params Optional parameters to filter the profiles diff --git a/src/services/sandboxes.ts b/src/services/sandboxes.ts index 826b4c8..1d51c98 100644 --- a/src/services/sandboxes.ts +++ b/src/services/sandboxes.ts @@ -13,9 +13,17 @@ import { SandboxExposeResult, SandboxExecParams, SandboxExecOptions, + SandboxImageListParams, SandboxImageListResponse, SandboxListParams, SandboxListResponse, + SandboxRuntimeBrowserAuthResponse, + CreateFirecrackerImageBuildParams, + CompleteFirecrackerImageBuildParams, + CreateFirecrackerImageBuildResponse, + FirecrackerImageBuildResponse, + FirecrackerImageBuildListParams, + FirecrackerImageBuildListResponse, SandboxMemorySnapshotParams, SandboxMemorySnapshotResult, SandboxProcessResult, @@ -484,9 +492,18 @@ export class SandboxesService extends BaseService { } } - async listImages(): Promise { + async listImages(params: SandboxImageListParams = {}): Promise { try { - return await this.request("/images"); + const query = { + page: params.page, + limit: params.limit, + source: Array.isArray(params.source) ? params.source : params.source ? [params.source] : undefined, + search: params.search, + }; + const hasQuery = Object.values(query).some((value) => value !== undefined); + return hasQuery + ? await this.request("/images", undefined, query) + : await this.request("/images"); } catch (error) { if (error instanceof HyperbrowserError) { throw error; @@ -502,6 +519,8 @@ export class SandboxesService extends BaseService { return await this.request("/snapshots", undefined, { status: params.status, imageName: params.imageName, + search: params.search, + page: params.page, limit: params.limit, }); } catch (error) { @@ -512,6 +531,97 @@ export class SandboxesService extends BaseService { } } + + async getRuntimeBrowserAuth( + id: string, + allowedOrigin: string + ): Promise { + try { + return await this.request(`/sandbox/${id}/runtime/browser-auth`, { + method: "POST", + headers: { Origin: allowedOrigin }, + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to issue runtime browser auth for sandbox ${id}`, undefined); + } + } + + async createImageBuild( + params: CreateFirecrackerImageBuildParams + ): Promise { + try { + return await this.request("/images/builds", { + method: "POST", + body: JSON.stringify(params), + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError("Failed to create image build", undefined); + } + } + + async listImageBuilds( + params: FirecrackerImageBuildListParams = {} + ): Promise { + try { + return await this.request("/images/builds", undefined, { + status: params.status, + limit: params.limit, + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError("Failed to list image builds", undefined); + } + } + + async getImageBuild(buildId: string): Promise { + try { + return await this.request(`/images/builds/${buildId}`); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get image build ${buildId}`, undefined); + } + } + + async completeImageBuild( + buildId: string, + params: CompleteFirecrackerImageBuildParams + ): Promise { + try { + return await this.request(`/images/builds/${buildId}/complete`, { + method: "POST", + body: JSON.stringify(params), + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to complete image build ${buildId}`, undefined); + } + } + + async cancelImageBuild(buildId: string): Promise { + try { + return await this.request(`/images/builds/${buildId}/cancel`, { + method: "POST", + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to cancel image build ${buildId}`, undefined); + } + } + async stop(id: string): Promise { try { return await this.request(`/sandbox/${id}/stop`, { diff --git a/src/services/sessions.ts b/src/services/sessions.ts index 0a1aec6..07d4ba1 100644 --- a/src/services/sessions.ts +++ b/src/services/sessions.ts @@ -21,6 +21,14 @@ import { UpdateSessionProxyParams, UpdateSessionScreenParams, SessionGetParams, + SessionLogsTokenResponse, + SessionInfoResponse, + SessionCreditUsageResponse, + SessionMetricsResponse, + SessionConsoleParams, + SessionConsoleResponse, + SessionNetworkParams, + SessionNetworkResponse, } from "../types/session"; import { BaseService } from "./base"; import { HyperbrowserError } from "../client"; @@ -330,6 +338,94 @@ export class SessionsService extends BaseService { } } + + async stopAll(): Promise { + try { + return await this.request("/sessions/stop", { method: "PUT" }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError("Failed to stop all sessions", undefined); + } + } + + async getLogsToken(id: string): Promise { + try { + return await this.request(`/session/${id}/logs-token`); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get logs token for session ${id}`, undefined); + } + } + + async getInfo(id: string): Promise { + try { + return await this.request(`/session/${id}/info`); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get info for session ${id}`, undefined); + } + } + + async getCreditUsage(id: string): Promise { + try { + return await this.request(`/session/${id}/credit-usage`); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get credit usage for session ${id}`, undefined); + } + } + + async getMetrics(id: string): Promise { + try { + return await this.request(`/session/${id}/metrics`); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get metrics for session ${id}`, undefined); + } + } + + async getConsoleLogs( + id: string, + params: SessionConsoleParams = {} + ): Promise { + try { + return await this.request(`/session/${id}/console`, undefined, { + ...params, + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get console logs for session ${id}`, undefined); + } + } + + async getNetworkLogs( + id: string, + params: SessionNetworkParams = {} + ): Promise { + try { + return await this.request(`/session/${id}/network`, undefined, { + ...params, + }); + } catch (error) { + if (error instanceof HyperbrowserError) { + throw error; + } + throw new HyperbrowserError(`Failed to get network logs for session ${id}`, undefined); + } + } + /** * Extend the duration of a session * @param id The ID of the session to extend diff --git a/src/services/volumes.ts b/src/services/volumes.ts index d6eb709..fb508a7 100644 --- a/src/services/volumes.ts +++ b/src/services/volumes.ts @@ -1,5 +1,5 @@ import { HyperbrowserError } from "../client"; -import { CreateVolumeParams, Volume, VolumeListResponse } from "../types/volume"; +import { CreateVolumeParams, Volume, VolumeListParams, VolumeListResponse } from "../types/volume"; import { BaseService } from "./base"; export class VolumesService extends BaseService { @@ -23,9 +23,17 @@ export class VolumesService extends BaseService { /** * List sandbox volumes for the current team. */ - async list(): Promise { + async list(params: VolumeListParams = {}): Promise { try { - return await this.request("/volume"); + const query = { + page: params.page, + limit: params.limit, + search: params.search, + }; + const hasQuery = Object.values(query).some((value) => value !== undefined); + return hasQuery + ? await this.request("/volume", undefined, query) + : await this.request("/volume"); } catch (error) { if (error instanceof HyperbrowserError) { throw error; diff --git a/src/types/agents/task.ts b/src/types/agents/task.ts new file mode 100644 index 0000000..9c69e22 --- /dev/null +++ b/src/types/agents/task.ts @@ -0,0 +1,69 @@ +import { TaskLlm, BrowserUseTaskStatus } from "../constants"; +import { CreateSessionParams } from "../session"; + +export type TaskStatus = BrowserUseTaskStatus; + +export interface AgentTaskListParams { + task?: string; + page?: number; + limit?: number; +} + +export interface AgentTaskSummary { + id: string; + createdAt: string; + status: TaskStatus; + task: string; +} + +export interface AgentTaskListResponse { + tasks: AgentTaskSummary[]; + totalCount: number; + page: number; + perPage: number; +} + +export interface StartTaskParams { + task: string; + llm?: TaskLlm; + sessionId?: string; + validateOutput?: boolean; + useVision?: boolean; + useVisionForPlanner?: boolean; + maxActionsPerStep?: number; + maxInputTokens?: number; + plannerLlm?: TaskLlm; + pageExtractionLlm?: TaskLlm; + plannerInterval?: number; + maxSteps?: number; + keepBrowserOpen?: boolean; + sessionOptions?: CreateSessionParams; +} + +export interface StartTaskResponse { + jobId: string; +} + +export interface TaskMetadata { + inputTokens?: number | null; + outputTokens?: number | null; + numTaskStepsCompleted?: number | null; +} + +export interface TaskData { + steps?: unknown[]; + finalResult?: string | null; + [key: string]: unknown; +} + +export interface TaskStatusResponse { + status: TaskStatus; +} + +export interface TaskResponse { + jobId: string; + status: TaskStatus; + metadata?: TaskMetadata | null; + data?: TaskData | null; + error?: string | null; +} diff --git a/src/types/constants.ts b/src/types/constants.ts index c9b0f58..829975d 100644 --- a/src/types/constants.ts +++ b/src/types/constants.ts @@ -32,6 +32,8 @@ export const POLLING_ATTEMPTS = 5; export type BrowserUseVersion = "0.1.40" | "0.7.10" | "latest"; +export type TaskLlm = BrowserUseLlm; + export type BrowserUseLlm = | "gpt-4o" | "gpt-4o-mini" diff --git a/src/types/index.ts b/src/types/index.ts index 86c8197..9285a01 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -15,6 +15,12 @@ export { ScrapeOptions, ScrapeJobStatusResponse, BatchScrapeJobStatusResponse, + StartBatchScrapeJobParams, + StartBatchScrapeJobResponse, + BatchScrapeJobResponse, + GetBatchScrapeJobParams, + ScrapedPage, + ScreenshotOptions, StorageStateOptions, } from "./scrape"; export { @@ -91,6 +97,18 @@ export { GeminiComputerUseApiKeys, GeminiComputerUseTaskMetadata, } from "./agents/gemini-computer-use"; +export { + TaskStatus, + TaskMetadata, + TaskData, + StartTaskParams, + StartTaskResponse, + TaskStatusResponse, + TaskResponse, + AgentTaskListParams, + AgentTaskSummary, + AgentTaskListResponse, +} from "./agents/task"; export { BasicResponse, SessionStatus, @@ -114,6 +132,19 @@ export { SessionProfile, SessionLaunchState, SessionCreditBreakdown, + SessionRecording, + CreateSessionProfile, + SessionLogsTokenResponse, + SessionInfoResponse, + SessionCreditUsageResponse, + SessionMetricsResponse, + SessionLogLevel, + SessionLogOrder, + SessionNetworkMethod, + SessionConsoleParams, + SessionConsoleResponse, + SessionNetworkParams, + SessionNetworkResponse, UpdateSessionProfileParams, UpdateSessionProxyLocationParams, UpdateSessionProxyParams, @@ -128,13 +159,26 @@ export { SandboxVolumeMount, SandboxListParams, SandboxListResponse, + SandboxImageSource, SandboxImageSummary, + SandboxImageListParams, SandboxImageListResponse, SandboxSnapshotStatus, SandboxSnapshotSummary, SandboxSnapshotListParams, SandboxSnapshotListResponse, CreateSandboxParams, + SandboxRuntimeBrowserAuthResponse, + FirecrackerImageBuildStatus, + FirecrackerImageInit, + CreateFirecrackerImageBuildParams, + CompleteFirecrackerImageBuildParams, + FirecrackerImageBuild, + FirecrackerImageBuildUpload, + CreateFirecrackerImageBuildResponse, + FirecrackerImageBuildResponse, + FirecrackerImageBuildListParams, + FirecrackerImageBuildListResponse, SandboxMemorySnapshotParams, SandboxMemorySnapshotResult, SandboxExposeParams, @@ -178,11 +222,13 @@ export { SandboxTerminalKillParams, SandboxTerminalEvent, } from "./sandbox"; -export { CreateVolumeParams, Volume, VolumeListResponse } from "./volume"; +export { CreateVolumeParams, Volume, VolumeListParams, VolumeListResponse } from "./volume"; export { CreateProfileParams, ProfileResponse, CreateProfileResponse, + UpdateProfileParams, + BatchDeleteProfilesParams, ProfileListParams, ProfileListResponse, } from "./profile"; @@ -220,6 +266,7 @@ export { SessionEventLogType, SessionRegion, BrowserUseVersion, + TaskLlm, HyperAgentVersion, } from "./constants"; export { TeamCreditInfo } from "./team"; @@ -256,6 +303,15 @@ export { BatchFetchJobResponse, BatchFetchJobStatus, } from "./web/batch-fetch"; +export { + StartWebCrawlJobParams, + GetWebCrawlJobParams, + StartWebCrawlJobResponse, + WebCrawlJobStatusResponse, + WebCrawlJobResponse, + WebCrawlJobStatus, + WebCrawlOptions, +} from "./web/crawl"; export { WebSearchParams, WebSearchResponse, diff --git a/src/types/profile.ts b/src/types/profile.ts index 0fac50c..ead8805 100644 --- a/src/types/profile.ts +++ b/src/types/profile.ts @@ -2,6 +2,14 @@ export interface CreateProfileParams { name?: string; } +export interface UpdateProfileParams { + name?: string; +} + +export interface BatchDeleteProfilesParams { + ids: string[]; +} + export interface CreateProfileResponse { id: string; name: string | null; diff --git a/src/types/sandbox.ts b/src/types/sandbox.ts index e50a65c..b565c31 100644 --- a/src/types/sandbox.ts +++ b/src/types/sandbox.ts @@ -103,12 +103,20 @@ export interface SandboxImageSummary { updatedAt: string; } +export type SandboxImageSource = "public" | "team"; + +export interface SandboxImageListParams { + page?: number; + limit?: number; + source?: SandboxImageSource | SandboxImageSource[]; + search?: string; +} + export interface SandboxImageListResponse { images: SandboxImageSummary[]; - // TODO: add pagination metadata when /api/images supports it. - // totalCount?: number; - // page?: number; - // perPage?: number; + totalCount: number; + page: number; + perPage: number; } export type SandboxSnapshotStatus = "creating" | "created" | "failed"; @@ -129,17 +137,108 @@ export interface SandboxSnapshotSummary { } export interface SandboxSnapshotListParams { - status?: SandboxSnapshotStatus; + status?: SandboxSnapshotStatus | SandboxSnapshotStatus[]; imageName?: string; + search?: string; + page?: number; limit?: number; } export interface SandboxSnapshotListResponse { snapshots: SandboxSnapshotSummary[]; - // TODO: add pagination metadata when /api/snapshots supports it. - // totalCount?: number; - // page?: number; - // perPage?: number; + totalCount: number; + page: number; + perPage: number; +} + + +export interface SandboxRuntimeBrowserAuthResponse { + runtime: SandboxRuntimeTarget; + allowedOrigin: string; + capabilities: string[]; + bootstrapUrl: string; + bootstrapUrlExpiresAt: string | null; +} + +export type FirecrackerImageBuildStatus = + | "awaiting_upload" + | "upload_verified" + | "dispatching" + | "building" + | "verifying" + | "completed" + | "failed" + | "canceled"; + +export interface FirecrackerImageInit { + commands?: string[]; + [key: string]: unknown; +} + +export interface CreateFirecrackerImageBuildParams { + imageName: string; + inputSha256: string; + inputSizeBytes: number; + inputFormat: string; + sourcePlatform: string; + imageConfigUser?: string; + imageInit?: FirecrackerImageInit; +} + +export interface CompleteFirecrackerImageBuildParams { + inputSha256: string; + inputSizeBytes: number; + inputFormat: string; +} + +export interface FirecrackerImageBuild { + id: string; + teamId: string; + userId: string | null; + namespace: string; + imageName: string; + imageId: string; + status: FirecrackerImageBuildStatus; + inputBucket?: string | null; + inputKey?: string | null; + inputSha256?: string | null; + inputSizeBytes?: number | null; + outputBucket?: string | null; + outputKey?: string | null; + vmId?: string | null; + errorCode?: string | null; + errorMessage?: string | null; + metadata?: Record | null; + completedAt?: string | null; + createdAt: string; + updatedAt: string; +} + +export interface FirecrackerImageBuildUpload { + url: string; + method: "PUT"; + headers: Record; + objectKey: string; + expiresInSeconds: number; + maxUploadBytes: number; +} + +export interface CreateFirecrackerImageBuildResponse { + build: FirecrackerImageBuild; + upload: FirecrackerImageBuildUpload; +} + +export interface FirecrackerImageBuildResponse { + build: FirecrackerImageBuild; +} + +export interface FirecrackerImageBuildListParams { + status?: FirecrackerImageBuildStatus; + limit?: number; +} + +export interface FirecrackerImageBuildListResponse { + builds: FirecrackerImageBuild[]; } export interface SandboxMemorySnapshotParams { diff --git a/src/types/session.ts b/src/types/session.ts index a3be087..befbe02 100644 --- a/src/types/session.ts +++ b/src/types/session.ts @@ -244,3 +244,76 @@ export interface UpdateSessionScreenParams { width: number; height: number; } + + +export interface SessionLogsTokenResponse { + token: string; + tokenExpiresAt: string; +} + +export interface SessionInfoProfile { + id: string; + name?: string | null; +} + +export interface SessionInfoResponse { + id: string; + status: SessionStatus; + startTime?: number | null; + launchState?: SessionLaunchState | null; + duration: number; + proxyBytesUsed: number; + region: string; + settings: unknown[]; + recordingUrl?: string | null; + videoRecordingUrl?: string | null; + videoRecordingPlaylistUrl?: string | null; + isRecordingEncrypted?: boolean | null; + liveUrl?: string | null; + liveDomain?: string | null; + profile?: SessionInfoProfile | null; + creditsUsed?: number | null; + creditBreakdown?: SessionCreditBreakdown | null; +} + +export interface SessionCreditUsageResponse { + creditUsage: number | null; +} + +export interface SessionMetricsResponse { + metrics: Array>; + displayedMetrics: string[]; +} + +export type SessionLogLevel = "log" | "debug" | "info" | "error" | "warning"; +export type SessionLogOrder = "asc" | "desc"; +export type SessionNetworkMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD"; + +export interface SessionConsoleParams { + logLevels?: SessionLogLevel[]; + search?: string; + afterTimestamp?: number; + beforeTimestamp?: number; + order?: SessionLogOrder; + limit?: number; +} + +export interface SessionNetworkParams { + methods?: SessionNetworkMethod[]; + statusCodes?: string[]; + search?: string; + afterTimestamp?: number; + beforeTimestamp?: number; + order?: SessionLogOrder; + limit?: number; +} + +export interface SessionConsoleResponse { + consoleLogs: Array>; + pages: Array>; +} + +export interface SessionNetworkResponse { + networkCalls: Array>; + pages: Array>; +} diff --git a/src/types/volume.ts b/src/types/volume.ts index 5831dc0..095a47c 100644 --- a/src/types/volume.ts +++ b/src/types/volume.ts @@ -9,6 +9,15 @@ export interface Volume { transferAmount?: number; } +export interface VolumeListParams { + page?: number; + limit?: number; + search?: string; +} + export interface VolumeListResponse { volumes: Volume[]; + totalCount: number; + page: number; + perPage: number; }