sandbox-agent 0.1.0-test.6 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -722,4 +722,24 @@ declare class SandboxAgent {
722
722
  private parseSseStream;
723
723
  }
724
724
 
725
- export { type AgentCapabilities, type AgentInfo, type AgentInstallRequest, type AgentListResponse, type AgentModeInfo, type AgentModesResponse, type AgentUnparsedData, type ContentPart, type CreateSessionRequest, type CreateSessionResponse, type ErrorData, type EventSource, type EventsQuery, type EventsResponse, type FileAction, type HealthResponse, type ItemDeltaData, type ItemEventData, type ItemKind, type ItemRole, type ItemStatus, type MessageRequest, type PermissionEventData, type PermissionReply, type PermissionReplyRequest, type PermissionStatus, type ProblemDetails, type QuestionEventData, type QuestionReplyRequest, type QuestionStatus, type ReasoningVisibility, SandboxAgent, type SandboxAgentConnectOptions, SandboxAgentError, type SandboxAgentSpawnLogMode, type SandboxAgentSpawnOptions, type SandboxAgentStartOptions, type SessionEndReason, type SessionEndedData, type SessionInfo, type SessionListResponse, type SessionStartedData, type TerminatedBy, type TurnStreamQuery, type UniversalEvent, type UniversalEventData, type UniversalEventType, type UniversalItem, type components, type paths };
725
+ interface InspectorUrlOptions {
726
+ /**
727
+ * Base URL of the sandbox-agent server.
728
+ */
729
+ baseUrl: string;
730
+ /**
731
+ * Optional bearer token for authentication.
732
+ */
733
+ token?: string;
734
+ /**
735
+ * Optional extra headers to pass to the sandbox-agent server.
736
+ * Will be JSON-encoded in the URL.
737
+ */
738
+ headers?: Record<string, string>;
739
+ }
740
+ /**
741
+ * Builds a URL to the sandbox-agent inspector UI with the given connection parameters.
742
+ */
743
+ declare function buildInspectorUrl(options: InspectorUrlOptions): string;
744
+
745
+ export { type AgentCapabilities, type AgentInfo, type AgentInstallRequest, type AgentListResponse, type AgentModeInfo, type AgentModesResponse, type AgentUnparsedData, type ContentPart, type CreateSessionRequest, type CreateSessionResponse, type ErrorData, type EventSource, type EventsQuery, type EventsResponse, type FileAction, type HealthResponse, type InspectorUrlOptions, type ItemDeltaData, type ItemEventData, type ItemKind, type ItemRole, type ItemStatus, type MessageRequest, type PermissionEventData, type PermissionReply, type PermissionReplyRequest, type PermissionStatus, type ProblemDetails, type QuestionEventData, type QuestionReplyRequest, type QuestionStatus, type ReasoningVisibility, SandboxAgent, type SandboxAgentConnectOptions, SandboxAgentError, type SandboxAgentSpawnLogMode, type SandboxAgentSpawnOptions, type SandboxAgentStartOptions, type SessionEndReason, type SessionEndedData, type SessionInfo, type SessionListResponse, type SessionStartedData, type TerminatedBy, type TurnStreamQuery, type UniversalEvent, type UniversalEventData, type UniversalEventType, type UniversalItem, buildInspectorUrl, type components, type paths };
package/dist/index.js CHANGED
@@ -232,8 +232,23 @@ var normalizeSpawnOptions = (spawn, defaultEnabled) => {
232
232
  }
233
233
  return { enabled: defaultEnabled };
234
234
  };
235
+
236
+ // src/inspector.ts
237
+ var INSPECTOR_URL = "https://inspect.sandboxagent.dev";
238
+ function buildInspectorUrl(options) {
239
+ const normalized = options.baseUrl.replace(/\/+$/, "");
240
+ const params = new URLSearchParams({ url: normalized });
241
+ if (options.token) {
242
+ params.set("token", options.token);
243
+ }
244
+ if (options.headers && Object.keys(options.headers).length > 0) {
245
+ params.set("headers", JSON.stringify(options.headers));
246
+ }
247
+ return `${INSPECTOR_URL}?${params.toString()}`;
248
+ }
235
249
  export {
236
250
  SandboxAgent,
237
- SandboxAgentError
251
+ SandboxAgentError,
252
+ buildInspectorUrl
238
253
  };
239
254
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { SandboxAgentSpawnHandle, SandboxAgentSpawnOptions } from \"./spawn.ts\";\nimport type {\n AgentInstallRequest,\n AgentListResponse,\n AgentModesResponse,\n CreateSessionRequest,\n CreateSessionResponse,\n EventsQuery,\n EventsResponse,\n HealthResponse,\n MessageRequest,\n PermissionReplyRequest,\n ProblemDetails,\n QuestionReplyRequest,\n SessionListResponse,\n TurnStreamQuery,\n UniversalEvent,\n} from \"./types.ts\";\n\nconst API_PREFIX = \"/v1\";\n\nexport interface SandboxAgentConnectOptions {\n baseUrl: string;\n token?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n}\n\nexport interface SandboxAgentStartOptions {\n spawn?: SandboxAgentSpawnOptions | boolean;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n}\n\nexport class SandboxAgentError extends Error {\n readonly status: number;\n readonly problem?: ProblemDetails;\n readonly response: Response;\n\n constructor(status: number, problem: ProblemDetails | undefined, response: Response) {\n super(problem?.title ?? `Request failed with status ${status}`);\n this.name = \"SandboxAgentError\";\n this.status = status;\n this.problem = problem;\n this.response = response;\n }\n}\n\ntype QueryValue = string | number | boolean | null | undefined;\n\ntype RequestOptions = {\n query?: Record<string, QueryValue>;\n body?: unknown;\n headers?: HeadersInit;\n accept?: string;\n signal?: AbortSignal;\n};\n\nexport class SandboxAgent {\n private readonly baseUrl: string;\n private readonly token?: string;\n private readonly fetcher: typeof fetch;\n private readonly defaultHeaders?: HeadersInit;\n private spawnHandle?: SandboxAgentSpawnHandle;\n\n private constructor(options: SandboxAgentConnectOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n this.fetcher = options.fetch ?? globalThis.fetch;\n this.defaultHeaders = options.headers;\n\n if (!this.fetcher) {\n throw new Error(\"Fetch API is not available; provide a fetch implementation.\");\n }\n }\n\n static async connect(options: SandboxAgentConnectOptions): Promise<SandboxAgent> {\n return new SandboxAgent(options);\n }\n\n static async start(options: SandboxAgentStartOptions = {}): Promise<SandboxAgent> {\n const spawnOptions = normalizeSpawnOptions(options.spawn, true);\n if (!spawnOptions.enabled) {\n throw new Error(\"SandboxAgent.start requires spawn to be enabled.\");\n }\n const { spawnSandboxAgent } = await import(\"./spawn.js\");\n const handle = await spawnSandboxAgent(spawnOptions, options.fetch ?? globalThis.fetch);\n const client = new SandboxAgent({\n baseUrl: handle.baseUrl,\n token: handle.token,\n fetch: options.fetch,\n headers: options.headers,\n });\n client.spawnHandle = handle;\n return client;\n }\n\n async listAgents(): Promise<AgentListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/agents`);\n }\n\n async getHealth(): Promise<HealthResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/health`);\n }\n\n async installAgent(agent: string, request: AgentInstallRequest = {}): Promise<void> {\n await this.requestJson(\"POST\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/install`, {\n body: request,\n });\n }\n\n async getAgentModes(agent: string): Promise<AgentModesResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/modes`);\n }\n\n async createSession(sessionId: string, request: CreateSessionRequest): Promise<CreateSessionResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}`, {\n body: request,\n });\n }\n\n async listSessions(): Promise<SessionListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/sessions`);\n }\n\n async postMessage(sessionId: string, request: MessageRequest): Promise<void> {\n await this.requestJson(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/messages`, {\n body: request,\n });\n }\n\n async getEvents(sessionId: string, query?: EventsQuery): Promise<EventsResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/events`, {\n query,\n });\n }\n\n async getEventsSse(sessionId: string, query?: EventsQuery, signal?: AbortSignal): Promise<Response> {\n return this.requestRaw(\"GET\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/events/sse`, {\n query,\n accept: \"text/event-stream\",\n signal,\n });\n }\n\n async postMessageStream(\n sessionId: string,\n request: MessageRequest,\n query?: TurnStreamQuery,\n signal?: AbortSignal,\n ): Promise<Response> {\n return this.requestRaw(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/messages/stream`, {\n query,\n body: request,\n accept: \"text/event-stream\",\n signal,\n });\n }\n\n async *streamEvents(\n sessionId: string,\n query?: EventsQuery,\n signal?: AbortSignal,\n ): AsyncGenerator<UniversalEvent, void, void> {\n const response = await this.getEventsSse(sessionId, query, signal);\n yield* this.parseSseStream(response);\n }\n\n async *streamTurn(\n sessionId: string,\n request: MessageRequest,\n query?: TurnStreamQuery,\n signal?: AbortSignal,\n ): AsyncGenerator<UniversalEvent, void, void> {\n const response = await this.postMessageStream(sessionId, request, query, signal);\n yield* this.parseSseStream(response);\n }\n\n async replyQuestion(\n sessionId: string,\n questionId: string,\n request: QuestionReplyRequest,\n ): Promise<void> {\n await this.requestJson(\n \"POST\",\n `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/questions/${encodeURIComponent(questionId)}/reply`,\n { body: request },\n );\n }\n\n async rejectQuestion(sessionId: string, questionId: string): Promise<void> {\n await this.requestJson(\n \"POST\",\n `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/questions/${encodeURIComponent(questionId)}/reject`,\n );\n }\n\n async replyPermission(\n sessionId: string,\n permissionId: string,\n request: PermissionReplyRequest,\n ): Promise<void> {\n await this.requestJson(\n \"POST\",\n `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/permissions/${encodeURIComponent(permissionId)}/reply`,\n { body: request },\n );\n }\n\n async terminateSession(sessionId: string): Promise<void> {\n await this.requestJson(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/terminate`);\n }\n\n async dispose(): Promise<void> {\n if (this.spawnHandle) {\n await this.spawnHandle.dispose();\n this.spawnHandle = undefined;\n }\n }\n\n private async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const response = await this.requestRaw(method, path, {\n query: options.query,\n body: options.body,\n headers: options.headers,\n accept: options.accept ?? \"application/json\",\n });\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n\n return JSON.parse(text) as T;\n }\n\n private async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = this.buildUrl(path, options.query);\n const headers = new Headers(this.defaultHeaders ?? undefined);\n\n if (this.token) {\n headers.set(\"Authorization\", `Bearer ${this.token}`);\n }\n\n if (options.accept) {\n headers.set(\"Accept\", options.accept);\n }\n\n const init: RequestInit = { method, headers, signal: options.signal };\n if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n init.body = JSON.stringify(options.body);\n }\n\n if (options.headers) {\n const extra = new Headers(options.headers);\n extra.forEach((value, key) => headers.set(key, value));\n }\n\n const response = await this.fetcher(url, init);\n if (!response.ok) {\n const problem = await this.readProblem(response);\n throw new SandboxAgentError(response.status, problem, response);\n }\n\n return response;\n }\n\n private buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n url.searchParams.set(key, String(value));\n });\n }\n return url.toString();\n }\n\n private async readProblem(response: Response): Promise<ProblemDetails | undefined> {\n try {\n const text = await response.clone().text();\n if (!text) {\n return undefined;\n }\n return JSON.parse(text) as ProblemDetails;\n } catch {\n return undefined;\n }\n }\n\n private async *parseSseStream(response: Response): AsyncGenerator<UniversalEvent, void, void> {\n if (!response.body) {\n throw new Error(\"SSE stream is not readable in this environment.\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n // Normalize CRLF to LF for consistent parsing\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n let index = buffer.indexOf(\"\\n\\n\");\n while (index !== -1) {\n const chunk = buffer.slice(0, index);\n buffer = buffer.slice(index + 2);\n const dataLines = chunk\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"));\n if (dataLines.length > 0) {\n const payload = dataLines\n .map((line) => line.slice(5).trim())\n .join(\"\\n\");\n if (payload) {\n yield JSON.parse(payload) as UniversalEvent;\n }\n }\n index = buffer.indexOf(\"\\n\\n\");\n }\n }\n }\n}\n\nconst normalizeSpawnOptions = (\n spawn: SandboxAgentSpawnOptions | boolean | undefined,\n defaultEnabled: boolean,\n): SandboxAgentSpawnOptions => {\n if (typeof spawn === \"boolean\") {\n return { enabled: spawn };\n }\n if (spawn) {\n return { enabled: spawn.enabled ?? defaultEnabled, ...spawn };\n }\n return { enabled: defaultEnabled };\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/client.ts","../src/inspector.ts"],"sourcesContent":["import type { SandboxAgentSpawnHandle, SandboxAgentSpawnOptions } from \"./spawn.ts\";\nimport type {\n AgentInstallRequest,\n AgentListResponse,\n AgentModesResponse,\n CreateSessionRequest,\n CreateSessionResponse,\n EventsQuery,\n EventsResponse,\n HealthResponse,\n MessageRequest,\n PermissionReplyRequest,\n ProblemDetails,\n QuestionReplyRequest,\n SessionListResponse,\n TurnStreamQuery,\n UniversalEvent,\n} from \"./types.ts\";\n\nconst API_PREFIX = \"/v1\";\n\nexport interface SandboxAgentConnectOptions {\n baseUrl: string;\n token?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n}\n\nexport interface SandboxAgentStartOptions {\n spawn?: SandboxAgentSpawnOptions | boolean;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n}\n\nexport class SandboxAgentError extends Error {\n readonly status: number;\n readonly problem?: ProblemDetails;\n readonly response: Response;\n\n constructor(status: number, problem: ProblemDetails | undefined, response: Response) {\n super(problem?.title ?? `Request failed with status ${status}`);\n this.name = \"SandboxAgentError\";\n this.status = status;\n this.problem = problem;\n this.response = response;\n }\n}\n\ntype QueryValue = string | number | boolean | null | undefined;\n\ntype RequestOptions = {\n query?: Record<string, QueryValue>;\n body?: unknown;\n headers?: HeadersInit;\n accept?: string;\n signal?: AbortSignal;\n};\n\nexport class SandboxAgent {\n private readonly baseUrl: string;\n private readonly token?: string;\n private readonly fetcher: typeof fetch;\n private readonly defaultHeaders?: HeadersInit;\n private spawnHandle?: SandboxAgentSpawnHandle;\n\n private constructor(options: SandboxAgentConnectOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.token = options.token;\n this.fetcher = options.fetch ?? globalThis.fetch;\n this.defaultHeaders = options.headers;\n\n if (!this.fetcher) {\n throw new Error(\"Fetch API is not available; provide a fetch implementation.\");\n }\n }\n\n static async connect(options: SandboxAgentConnectOptions): Promise<SandboxAgent> {\n return new SandboxAgent(options);\n }\n\n static async start(options: SandboxAgentStartOptions = {}): Promise<SandboxAgent> {\n const spawnOptions = normalizeSpawnOptions(options.spawn, true);\n if (!spawnOptions.enabled) {\n throw new Error(\"SandboxAgent.start requires spawn to be enabled.\");\n }\n const { spawnSandboxAgent } = await import(\"./spawn.js\");\n const handle = await spawnSandboxAgent(spawnOptions, options.fetch ?? globalThis.fetch);\n const client = new SandboxAgent({\n baseUrl: handle.baseUrl,\n token: handle.token,\n fetch: options.fetch,\n headers: options.headers,\n });\n client.spawnHandle = handle;\n return client;\n }\n\n async listAgents(): Promise<AgentListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/agents`);\n }\n\n async getHealth(): Promise<HealthResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/health`);\n }\n\n async installAgent(agent: string, request: AgentInstallRequest = {}): Promise<void> {\n await this.requestJson(\"POST\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/install`, {\n body: request,\n });\n }\n\n async getAgentModes(agent: string): Promise<AgentModesResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/modes`);\n }\n\n async createSession(sessionId: string, request: CreateSessionRequest): Promise<CreateSessionResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}`, {\n body: request,\n });\n }\n\n async listSessions(): Promise<SessionListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/sessions`);\n }\n\n async postMessage(sessionId: string, request: MessageRequest): Promise<void> {\n await this.requestJson(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/messages`, {\n body: request,\n });\n }\n\n async getEvents(sessionId: string, query?: EventsQuery): Promise<EventsResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/events`, {\n query,\n });\n }\n\n async getEventsSse(sessionId: string, query?: EventsQuery, signal?: AbortSignal): Promise<Response> {\n return this.requestRaw(\"GET\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/events/sse`, {\n query,\n accept: \"text/event-stream\",\n signal,\n });\n }\n\n async postMessageStream(\n sessionId: string,\n request: MessageRequest,\n query?: TurnStreamQuery,\n signal?: AbortSignal,\n ): Promise<Response> {\n return this.requestRaw(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/messages/stream`, {\n query,\n body: request,\n accept: \"text/event-stream\",\n signal,\n });\n }\n\n async *streamEvents(\n sessionId: string,\n query?: EventsQuery,\n signal?: AbortSignal,\n ): AsyncGenerator<UniversalEvent, void, void> {\n const response = await this.getEventsSse(sessionId, query, signal);\n yield* this.parseSseStream(response);\n }\n\n async *streamTurn(\n sessionId: string,\n request: MessageRequest,\n query?: TurnStreamQuery,\n signal?: AbortSignal,\n ): AsyncGenerator<UniversalEvent, void, void> {\n const response = await this.postMessageStream(sessionId, request, query, signal);\n yield* this.parseSseStream(response);\n }\n\n async replyQuestion(\n sessionId: string,\n questionId: string,\n request: QuestionReplyRequest,\n ): Promise<void> {\n await this.requestJson(\n \"POST\",\n `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/questions/${encodeURIComponent(questionId)}/reply`,\n { body: request },\n );\n }\n\n async rejectQuestion(sessionId: string, questionId: string): Promise<void> {\n await this.requestJson(\n \"POST\",\n `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/questions/${encodeURIComponent(questionId)}/reject`,\n );\n }\n\n async replyPermission(\n sessionId: string,\n permissionId: string,\n request: PermissionReplyRequest,\n ): Promise<void> {\n await this.requestJson(\n \"POST\",\n `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/permissions/${encodeURIComponent(permissionId)}/reply`,\n { body: request },\n );\n }\n\n async terminateSession(sessionId: string): Promise<void> {\n await this.requestJson(\"POST\", `${API_PREFIX}/sessions/${encodeURIComponent(sessionId)}/terminate`);\n }\n\n async dispose(): Promise<void> {\n if (this.spawnHandle) {\n await this.spawnHandle.dispose();\n this.spawnHandle = undefined;\n }\n }\n\n private async requestJson<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const response = await this.requestRaw(method, path, {\n query: options.query,\n body: options.body,\n headers: options.headers,\n accept: options.accept ?? \"application/json\",\n });\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n\n return JSON.parse(text) as T;\n }\n\n private async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = this.buildUrl(path, options.query);\n const headers = new Headers(this.defaultHeaders ?? undefined);\n\n if (this.token) {\n headers.set(\"Authorization\", `Bearer ${this.token}`);\n }\n\n if (options.accept) {\n headers.set(\"Accept\", options.accept);\n }\n\n const init: RequestInit = { method, headers, signal: options.signal };\n if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n init.body = JSON.stringify(options.body);\n }\n\n if (options.headers) {\n const extra = new Headers(options.headers);\n extra.forEach((value, key) => headers.set(key, value));\n }\n\n const response = await this.fetcher(url, init);\n if (!response.ok) {\n const problem = await this.readProblem(response);\n throw new SandboxAgentError(response.status, problem, response);\n }\n\n return response;\n }\n\n private buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n url.searchParams.set(key, String(value));\n });\n }\n return url.toString();\n }\n\n private async readProblem(response: Response): Promise<ProblemDetails | undefined> {\n try {\n const text = await response.clone().text();\n if (!text) {\n return undefined;\n }\n return JSON.parse(text) as ProblemDetails;\n } catch {\n return undefined;\n }\n }\n\n private async *parseSseStream(response: Response): AsyncGenerator<UniversalEvent, void, void> {\n if (!response.body) {\n throw new Error(\"SSE stream is not readable in this environment.\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n // Normalize CRLF to LF for consistent parsing\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n let index = buffer.indexOf(\"\\n\\n\");\n while (index !== -1) {\n const chunk = buffer.slice(0, index);\n buffer = buffer.slice(index + 2);\n const dataLines = chunk\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"));\n if (dataLines.length > 0) {\n const payload = dataLines\n .map((line) => line.slice(5).trim())\n .join(\"\\n\");\n if (payload) {\n yield JSON.parse(payload) as UniversalEvent;\n }\n }\n index = buffer.indexOf(\"\\n\\n\");\n }\n }\n }\n}\n\nconst normalizeSpawnOptions = (\n spawn: SandboxAgentSpawnOptions | boolean | undefined,\n defaultEnabled: boolean,\n): SandboxAgentSpawnOptions => {\n if (typeof spawn === \"boolean\") {\n return { enabled: spawn };\n }\n if (spawn) {\n return { enabled: spawn.enabled ?? defaultEnabled, ...spawn };\n }\n return { enabled: defaultEnabled };\n};\n","const INSPECTOR_URL = \"https://inspect.sandboxagent.dev\";\n\nexport 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 */\nexport function buildInspectorUrl(options: InspectorUrlOptions): string {\n const normalized = options.baseUrl.replace(/\\/+$/, \"\");\n const params = new URLSearchParams({ url: normalized });\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 return `${INSPECTOR_URL}?${params.toString()}`;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sandbox-agent",
3
- "version": "0.1.0-test.6",
3
+ "version": "0.1.2",
4
4
  "description": "Universal API for automatic coding agents in sandboxes. Supprots Claude Code, Codex, OpenCode, and Amp.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -30,7 +30,7 @@
30
30
  "@sandbox-agent/cli": "0.1.0"
31
31
  },
32
32
  "scripts": {
33
- "generate:openapi": "cargo check -p sandbox-agent-openapi-gen && cargo run -p sandbox-agent-openapi-gen -- --out ../../docs/openapi.json",
33
+ "generate:openapi": "SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo run -p sandbox-agent-openapi-gen -- --out ../../docs/openapi.json",
34
34
  "generate:types": "openapi-typescript ../../docs/openapi.json -o src/generated/openapi.ts",
35
35
  "generate": "pnpm run generate:openapi && pnpm run generate:types",
36
36
  "build": "if [ -z \"$SKIP_OPENAPI_GEN\" ]; then pnpm run generate:openapi; fi && pnpm run generate:types && tsup",