sandbox-agent 0.3.1 → 0.3.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.js CHANGED
@@ -16,10 +16,7 @@ var InMemorySessionPersistDriver = class {
16
16
  eventsBySession = /* @__PURE__ */ new Map();
17
17
  constructor(options = {}) {
18
18
  this.maxSessions = normalizeCap(options.maxSessions, DEFAULT_MAX_SESSIONS);
19
- this.maxEventsPerSession = normalizeCap(
20
- options.maxEventsPerSession,
21
- DEFAULT_MAX_EVENTS_PER_SESSION
22
- );
19
+ this.maxEventsPerSession = normalizeCap(options.maxEventsPerSession, DEFAULT_MAX_EVENTS_PER_SESSION);
23
20
  }
24
21
  async getSession(id) {
25
22
  const session = this.sessions.get(id);
@@ -151,9 +148,7 @@ var UnsupportedSessionCategoryError = class extends Error {
151
148
  category;
152
149
  availableCategories;
153
150
  constructor(sessionId, category, availableCategories) {
154
- super(
155
- `Session '${sessionId}' does not support category '${category}'. Available categories: ${availableCategories.join(", ") || "(none)"}`
156
- );
151
+ super(`Session '${sessionId}' does not support category '${category}'. Available categories: ${availableCategories.join(", ") || "(none)"}`);
157
152
  this.name = "UnsupportedSessionCategoryError";
158
153
  this.sessionId = sessionId;
159
154
  this.category = category;
@@ -183,9 +178,7 @@ var UnsupportedSessionConfigOptionError = class extends Error {
183
178
  configId;
184
179
  availableConfigIds;
185
180
  constructor(sessionId, configId, availableConfigIds) {
186
- super(
187
- `Session '${sessionId}' does not expose config option '${configId}'. Available configIds: ${availableConfigIds.join(", ") || "(none)"}`
188
- );
181
+ super(`Session '${sessionId}' does not expose config option '${configId}'. Available configIds: ${availableConfigIds.join(", ") || "(none)"}`);
189
182
  this.name = "UnsupportedSessionConfigOptionError";
190
183
  this.sessionId = sessionId;
191
184
  this.configId = configId;
@@ -197,9 +190,7 @@ var UnsupportedPermissionReplyError = class extends Error {
197
190
  requestedReply;
198
191
  availableReplies;
199
192
  constructor(permissionId, requestedReply, availableReplies) {
200
- super(
201
- `Permission '${permissionId}' does not support reply '${requestedReply}'. Available replies: ${availableReplies.join(", ") || "(none)"}`
202
- );
193
+ super(`Permission '${permissionId}' does not support reply '${requestedReply}'. Available replies: ${availableReplies.join(", ") || "(none)"}`);
203
194
  this.name = "UnsupportedPermissionReplyError";
204
195
  this.permissionId = permissionId;
205
196
  this.requestedReply = requestedReply;
@@ -346,13 +337,7 @@ var LiveAcpConnection = class _LiveAcpConnection {
346
337
  live.handleEnvelope(envelope, direction);
347
338
  }
348
339
  });
349
- live = new _LiveAcpConnection(
350
- options.agent,
351
- connectionId,
352
- acp,
353
- options.onObservedEnvelope,
354
- options.onPermissionRequest
355
- );
340
+ live = new _LiveAcpConnection(options.agent, connectionId, acp, options.onObservedEnvelope, options.onPermissionRequest);
356
341
  const initResult = await acp.initialize({
357
342
  protocolVersion: PROTOCOL_VERSION,
358
343
  clientInfo: {
@@ -463,12 +448,7 @@ var LiveAcpConnection = class _LiveAcpConnection {
463
448
  if (!localSessionId) {
464
449
  return cancelledPermissionResponse();
465
450
  }
466
- return this.onPermissionRequest(
467
- this,
468
- localSessionId,
469
- agentSessionId,
470
- clonePermissionRequest(request)
471
- );
451
+ return this.onPermissionRequest(this, localSessionId, agentSessionId, clonePermissionRequest(request));
472
452
  }
473
453
  resolveSessionId(envelope, direction) {
474
454
  const id = envelopeId(envelope);
@@ -700,7 +680,7 @@ var SandboxAgent = class _SandboxAgent {
700
680
  if (!spawnOptions.enabled) {
701
681
  throw new Error("SandboxAgent.start requires spawn to be enabled.");
702
682
  }
703
- const { spawnSandboxAgent } = await import("./spawn-BQVVCZX7.js");
683
+ const { spawnSandboxAgent } = await import("./spawn-ROM6CN74.js");
704
684
  const resolvedFetch = options.fetch ?? globalThis.fetch?.bind(globalThis);
705
685
  const handle = await spawnSandboxAgent(spawnOptions, resolvedFetch);
706
686
  const client = new _SandboxAgent({
@@ -868,13 +848,7 @@ var SandboxAgent = class _SandboxAgent {
868
848
  throw new UnsupportedSessionValueError(sessionId, "mode", "mode", mode, knownModeIds);
869
849
  }
870
850
  try {
871
- return await this.sendSessionMethodInternal(
872
- sessionId,
873
- "session/set_mode",
874
- { modeId: mode },
875
- {},
876
- false
877
- );
851
+ return await this.sendSessionMethodInternal(sessionId, "session/set_mode", { modeId: mode }, {}, false);
878
852
  } catch (error) {
879
853
  if (!(error instanceof AcpRpcError) || error.code !== -32601) {
880
854
  throw error;
@@ -902,13 +876,7 @@ var SandboxAgent = class _SandboxAgent {
902
876
  }
903
877
  const allowedValues = extractConfigValues(option);
904
878
  if (allowedValues.length > 0 && !allowedValues.includes(resolvedValue)) {
905
- throw new UnsupportedSessionValueError(
906
- sessionId,
907
- option.category ?? "uncategorized",
908
- option.id,
909
- resolvedValue,
910
- allowedValues
911
- );
879
+ throw new UnsupportedSessionValueError(sessionId, option.category ?? "uncategorized", option.id, resolvedValue, allowedValues);
912
880
  }
913
881
  return await this.sendSessionMethodInternal(
914
882
  sessionId,
@@ -965,13 +933,7 @@ var SandboxAgent = class _SandboxAgent {
965
933
  }
966
934
  const allowedValues = extractConfigValues(option);
967
935
  if (allowedValues.length > 0 && !allowedValues.includes(resolvedValue)) {
968
- throw new UnsupportedSessionValueError(
969
- sessionId,
970
- category,
971
- option.id,
972
- resolvedValue,
973
- allowedValues
974
- );
936
+ throw new UnsupportedSessionValueError(sessionId, category, option.id, resolvedValue, allowedValues);
975
937
  }
976
938
  return this.setSessionConfigOption(sessionId, option.id, resolvedValue);
977
939
  }
@@ -980,14 +942,22 @@ var SandboxAgent = class _SandboxAgent {
980
942
  return snapshot;
981
943
  }
982
944
  const info = await this.getAgent(snapshot.agent, { config: true });
983
- const configOptions = normalizeSessionConfigOptions(info.configOptions) ?? [];
945
+ let configOptions = normalizeSessionConfigOptions(info.configOptions) ?? [];
984
946
  const record = await this.persist.getSession(sessionId);
985
947
  if (!record) {
986
948
  return { ...snapshot, configOptions };
987
949
  }
950
+ const currentModeId = record.modes?.currentModeId;
951
+ if (currentModeId) {
952
+ const modeOption = findConfigOptionByCategory(configOptions, "mode");
953
+ if (modeOption) {
954
+ configOptions = applyConfigOptionValue(configOptions, modeOption.id, currentModeId) ?? configOptions;
955
+ }
956
+ }
988
957
  const updated = {
989
958
  ...record,
990
- configOptions
959
+ configOptions,
960
+ modes: deriveModesFromConfigOptions(configOptions) ?? record.modes
991
961
  };
992
962
  await this.persist.updateSession(updated);
993
963
  return updated;
@@ -1262,15 +1232,11 @@ var SandboxAgent = class _SandboxAgent {
1262
1232
  }
1263
1233
  async followProcessLogs(id, listener, query = {}) {
1264
1234
  const abortController = new AbortController();
1265
- const response = await this.requestRaw(
1266
- "GET",
1267
- `${API_PREFIX}/processes/${encodeURIComponent(id)}/logs`,
1268
- {
1269
- query: { ...query, follow: true },
1270
- accept: "text/event-stream",
1271
- signal: abortController.signal
1272
- }
1273
- );
1235
+ const response = await this.requestRaw("GET", `${API_PREFIX}/processes/${encodeURIComponent(id)}/logs`, {
1236
+ query: { ...query, follow: true },
1237
+ accept: "text/event-stream",
1238
+ signal: abortController.signal
1239
+ });
1274
1240
  if (!response.body) {
1275
1241
  abortController.abort();
1276
1242
  throw new Error("SSE stream is not readable in this environment.");
@@ -1287,13 +1253,9 @@ var SandboxAgent = class _SandboxAgent {
1287
1253
  });
1288
1254
  }
1289
1255
  async resizeProcessTerminal(id, request) {
1290
- return this.requestJson(
1291
- "POST",
1292
- `${API_PREFIX}/processes/${encodeURIComponent(id)}/terminal/resize`,
1293
- {
1294
- body: request
1295
- }
1296
- );
1256
+ return this.requestJson("POST", `${API_PREFIX}/processes/${encodeURIComponent(id)}/terminal/resize`, {
1257
+ body: request
1258
+ });
1297
1259
  }
1298
1260
  buildProcessTerminalWebSocketUrl(id, options = {}) {
1299
1261
  return toWebSocketUrl(
@@ -1641,9 +1603,7 @@ var SandboxAgent = class _SandboxAgent {
1641
1603
  const now = Date.now();
1642
1604
  if (now >= nextLogAt) {
1643
1605
  const details = formatHealthWaitError(lastError);
1644
- console.warn(
1645
- `sandbox-agent at ${this.baseUrl} is not healthy after ${now - startedAt}ms; still waiting (${details})`
1646
- );
1606
+ console.warn(`sandbox-agent at ${this.baseUrl} is not healthy after ${now - startedAt}ms; still waiting (${details})`);
1647
1607
  nextLogAt = now + HEALTH_WAIT_LOG_EVERY_MS;
1648
1608
  }
1649
1609
  await sleep(delayMs, signal);
@@ -1652,9 +1612,7 @@ var SandboxAgent = class _SandboxAgent {
1652
1612
  if (this.disposed) {
1653
1613
  return;
1654
1614
  }
1655
- throw new Error(
1656
- `Timed out waiting for sandbox-agent health after ${this.healthWait.timeoutMs}ms (${formatHealthWaitError(lastError)})`
1657
- );
1615
+ throw new Error(`Timed out waiting for sandbox-agent health after ${this.healthWait.timeoutMs}ms (${formatHealthWaitError(lastError)})`);
1658
1616
  }
1659
1617
  buildHeaders(extra) {
1660
1618
  const headers = new Headers(this.defaultHeaders ?? void 0);
@@ -1749,9 +1707,7 @@ function bytesToBase64(bytes) {
1749
1707
  throw new Error("Base64 encoding is not available in this environment.");
1750
1708
  }
1751
1709
  async function autoAuthenticate(acp, methods) {
1752
- const envBased = methods.find(
1753
- (m) => m.id === "codex-api-key" || m.id === "openai-api-key" || m.id === "anthropic-api-key"
1754
- );
1710
+ const envBased = methods.find((m) => m.id === "codex-api-key" || m.id === "openai-api-key" || m.id === "anthropic-api-key");
1755
1711
  if (!envBased) {
1756
1712
  return;
1757
1713
  }
@@ -2072,11 +2028,7 @@ function permissionReplyToResponse(permissionId, request, reply) {
2072
2028
  const preferredKinds = reply === "once" ? ["allow_once"] : reply === "always" ? ["allow_always", "allow_once"] : ["reject_once", "reject_always"];
2073
2029
  const selected = preferredKinds.map((kind) => request.options.find((option) => option.kind === kind)).find((option) => Boolean(option));
2074
2030
  if (!selected) {
2075
- throw new UnsupportedPermissionReplyError(
2076
- permissionId,
2077
- reply,
2078
- availablePermissionReplies(request.options)
2079
- );
2031
+ throw new UnsupportedPermissionReplyError(permissionId, reply, availablePermissionReplies(request.options));
2080
2032
  }
2081
2033
  return {
2082
2034
  outcome: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/types.ts","../src/index.ts","../src/inspector.ts"],"sourcesContent":["import {\n AcpHttpClient,\n AcpRpcError,\n PROTOCOL_VERSION,\n type AcpEnvelopeDirection,\n type AnyMessage,\n type AuthMethod,\n type CancelNotification,\n type NewSessionRequest,\n type NewSessionResponse,\n type PermissionOption,\n type PermissionOptionKind,\n type PromptRequest,\n type PromptResponse,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type SessionConfigOption,\n type SessionNotification,\n type SessionModeState,\n type SetSessionConfigOptionResponse,\n type SetSessionConfigOptionRequest,\n type SetSessionModeResponse,\n type SetSessionModeRequest,\n} from \"acp-http-client\";\nimport type { SandboxAgentSpawnHandle, SandboxAgentSpawnOptions } from \"./spawn.ts\";\nimport {\n type AcpServerListResponse,\n type AgentInfo,\n type AgentInstallRequest,\n type AgentInstallResponse,\n type AgentListResponse,\n type FsActionResponse,\n type FsDeleteQuery,\n type FsEntriesQuery,\n type FsEntry,\n type FsMoveRequest,\n type FsMoveResponse,\n type FsPathQuery,\n type FsStat,\n type FsUploadBatchQuery,\n type FsUploadBatchResponse,\n type FsWriteResponse,\n type HealthResponse,\n InMemorySessionPersistDriver,\n type ListEventsRequest,\n type ListPage,\n type ListPageRequest,\n type McpConfigQuery,\n type McpServerConfig,\n type ProblemDetails,\n type ProcessConfig,\n type ProcessCreateRequest,\n type ProcessInfo,\n type ProcessInputRequest,\n type ProcessInputResponse,\n type ProcessListResponse,\n type ProcessLogEntry,\n type ProcessLogsQuery,\n type ProcessLogsResponse,\n type ProcessRunRequest,\n type ProcessRunResponse,\n type ProcessSignalQuery,\n type ProcessTerminalClientFrame,\n type ProcessTerminalServerFrame,\n type ProcessTerminalResizeRequest,\n type ProcessTerminalResizeResponse,\n type SessionEvent,\n type SessionPersistDriver,\n type SessionRecord,\n type SkillsConfig,\n type SkillsConfigQuery,\n type TerminalErrorStatus,\n type TerminalExitStatus,\n type TerminalReadyStatus,\n type TerminalResizePayload,\n} from \"./types.ts\";\n\nconst API_PREFIX = \"/v1\";\nconst FS_PATH = `${API_PREFIX}/fs`;\nconst DEFAULT_BASE_URL = \"http://sandbox-agent\";\n\nconst DEFAULT_REPLAY_MAX_EVENTS = 50;\nconst DEFAULT_REPLAY_MAX_CHARS = 12_000;\nconst EVENT_INDEX_SCAN_EVENTS_LIMIT = 500;\nconst SESSION_CANCEL_METHOD = \"session/cancel\";\nconst MANUAL_CANCEL_ERROR =\n \"Manual session/cancel calls are not allowed. Use destroySession(sessionId) instead.\";\nconst HEALTH_WAIT_MIN_DELAY_MS = 500;\nconst HEALTH_WAIT_MAX_DELAY_MS = 15_000;\nconst HEALTH_WAIT_LOG_AFTER_MS = 5_000;\nconst HEALTH_WAIT_LOG_EVERY_MS = 10_000;\n\nexport interface SandboxAgentHealthWaitOptions {\n timeoutMs?: number;\n}\n\ninterface SandboxAgentConnectCommonOptions {\n headers?: HeadersInit;\n persist?: SessionPersistDriver;\n replayMaxEvents?: number;\n replayMaxChars?: number;\n signal?: AbortSignal;\n token?: string;\n waitForHealth?: boolean | SandboxAgentHealthWaitOptions;\n}\n\nexport type SandboxAgentConnectOptions =\n | (SandboxAgentConnectCommonOptions & {\n baseUrl: string;\n fetch?: typeof fetch;\n })\n | (SandboxAgentConnectCommonOptions & {\n fetch: typeof fetch;\n baseUrl?: string;\n });\n\nexport interface SandboxAgentStartOptions {\n fetch?: typeof fetch;\n headers?: HeadersInit;\n persist?: SessionPersistDriver;\n replayMaxEvents?: number;\n replayMaxChars?: number;\n spawn?: SandboxAgentSpawnOptions | boolean;\n}\n\nexport interface SessionCreateRequest {\n id?: string;\n agent: string;\n sessionInit?: Omit<NewSessionRequest, \"_meta\">;\n model?: string;\n mode?: string;\n thoughtLevel?: string;\n}\n\nexport interface SessionResumeOrCreateRequest {\n id: string;\n agent: string;\n sessionInit?: Omit<NewSessionRequest, \"_meta\">;\n model?: string;\n mode?: string;\n thoughtLevel?: string;\n}\n\nexport interface SessionSendOptions {\n notification?: boolean;\n}\n\nexport type SessionEventListener = (event: SessionEvent) => void;\nexport type PermissionReply = \"once\" | \"always\" | \"reject\";\nexport type PermissionRequestListener = (request: SessionPermissionRequest) => void;\nexport type ProcessLogListener = (entry: ProcessLogEntry) => void;\nexport type ProcessLogFollowQuery = Omit<ProcessLogsQuery, \"follow\">;\n\nexport interface SessionPermissionRequestOption {\n optionId: string;\n name: string;\n kind: PermissionOptionKind;\n}\n\nexport interface SessionPermissionRequest {\n id: string;\n createdAt: number;\n sessionId: string;\n agentSessionId: string;\n availableReplies: PermissionReply[];\n options: SessionPermissionRequestOption[];\n toolCall: RequestPermissionRequest[\"toolCall\"];\n rawRequest: RequestPermissionRequest;\n}\n\nexport interface AgentQueryOptions {\n config?: boolean;\n noCache?: boolean;\n}\n\nexport interface ProcessLogSubscription {\n close(): void;\n closed: Promise<void>;\n}\n\nexport interface ProcessTerminalWebSocketUrlOptions {\n accessToken?: string;\n}\n\nexport interface ProcessTerminalConnectOptions extends ProcessTerminalWebSocketUrlOptions {\n protocols?: string | string[];\n WebSocket?: typeof WebSocket;\n}\n\nexport type ProcessTerminalSessionOptions = ProcessTerminalConnectOptions;\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\nexport class UnsupportedSessionCategoryError extends Error {\n readonly sessionId: string;\n readonly category: string;\n readonly availableCategories: string[];\n\n constructor(sessionId: string, category: string, availableCategories: string[]) {\n super(\n `Session '${sessionId}' does not support category '${category}'. Available categories: ${availableCategories.join(\", \") || \"(none)\"}`,\n );\n this.name = \"UnsupportedSessionCategoryError\";\n this.sessionId = sessionId;\n this.category = category;\n this.availableCategories = availableCategories;\n }\n}\n\nexport class UnsupportedSessionValueError extends Error {\n readonly sessionId: string;\n readonly category: string;\n readonly configId: string;\n readonly requestedValue: string;\n readonly allowedValues: string[];\n\n constructor(\n sessionId: string,\n category: string,\n configId: string,\n requestedValue: string,\n allowedValues: string[],\n ) {\n super(\n `Session '${sessionId}' does not support value '${requestedValue}' for category '${category}' (configId='${configId}'). Allowed values: ${allowedValues.join(\", \") || \"(none)\"}`,\n );\n this.name = \"UnsupportedSessionValueError\";\n this.sessionId = sessionId;\n this.category = category;\n this.configId = configId;\n this.requestedValue = requestedValue;\n this.allowedValues = allowedValues;\n }\n}\n\nexport class UnsupportedSessionConfigOptionError extends Error {\n readonly sessionId: string;\n readonly configId: string;\n readonly availableConfigIds: string[];\n\n constructor(sessionId: string, configId: string, availableConfigIds: string[]) {\n super(\n `Session '${sessionId}' does not expose config option '${configId}'. Available configIds: ${availableConfigIds.join(\", \") || \"(none)\"}`,\n );\n this.name = \"UnsupportedSessionConfigOptionError\";\n this.sessionId = sessionId;\n this.configId = configId;\n this.availableConfigIds = availableConfigIds;\n }\n}\n\nexport class UnsupportedPermissionReplyError extends Error {\n readonly permissionId: string;\n readonly requestedReply: PermissionReply;\n readonly availableReplies: PermissionReply[];\n\n constructor(permissionId: string, requestedReply: PermissionReply, availableReplies: PermissionReply[]) {\n super(\n `Permission '${permissionId}' does not support reply '${requestedReply}'. Available replies: ${availableReplies.join(\", \") || \"(none)\"}`,\n );\n this.name = \"UnsupportedPermissionReplyError\";\n this.permissionId = permissionId;\n this.requestedReply = requestedReply;\n this.availableReplies = availableReplies;\n }\n}\n\nexport class Session {\n private record: SessionRecord;\n private readonly sandbox: SandboxAgent;\n\n constructor(sandbox: SandboxAgent, record: SessionRecord) {\n this.sandbox = sandbox;\n this.record = { ...record };\n }\n\n get id(): string {\n return this.record.id;\n }\n\n get agent(): string {\n return this.record.agent;\n }\n\n get agentSessionId(): string {\n return this.record.agentSessionId;\n }\n\n get lastConnectionId(): string {\n return this.record.lastConnectionId;\n }\n\n get createdAt(): number {\n return this.record.createdAt;\n }\n\n get destroyedAt(): number | undefined {\n return this.record.destroyedAt;\n }\n\n async refresh(): Promise<Session> {\n const latest = await this.sandbox.getSession(this.id);\n if (!latest) {\n throw new Error(`session '${this.id}' no longer exists`);\n }\n this.apply(latest.toRecord());\n return this;\n }\n\n async rawSend(method: string, params: Record<string, unknown> = {}, options: SessionSendOptions = {}): Promise<unknown> {\n const updated = await this.sandbox.rawSendSessionMethod(this.id, method, params, options);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async prompt(prompt: PromptRequest[\"prompt\"]): Promise<PromptResponse> {\n const response = await this.rawSend(\"session/prompt\", { prompt });\n return response as PromptResponse;\n }\n\n async setMode(modeId: string): Promise<SetSessionModeResponse | void> {\n const updated = await this.sandbox.setSessionMode(this.id, modeId);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async setConfigOption(configId: string, value: string): Promise<SetSessionConfigOptionResponse> {\n const updated = await this.sandbox.setSessionConfigOption(this.id, configId, value);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async setModel(model: string): Promise<SetSessionConfigOptionResponse> {\n const updated = await this.sandbox.setSessionModel(this.id, model);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async setThoughtLevel(thoughtLevel: string): Promise<SetSessionConfigOptionResponse> {\n const updated = await this.sandbox.setSessionThoughtLevel(this.id, thoughtLevel);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async getConfigOptions(): Promise<SessionConfigOption[]> {\n return this.sandbox.getSessionConfigOptions(this.id);\n }\n\n async getModes(): Promise<SessionModeState | null> {\n return this.sandbox.getSessionModes(this.id);\n }\n\n onEvent(listener: SessionEventListener): () => void {\n return this.sandbox.onSessionEvent(this.id, listener);\n }\n\n onPermissionRequest(listener: PermissionRequestListener): () => void {\n return this.sandbox.onPermissionRequest(this.id, listener);\n }\n\n async respondPermission(permissionId: string, reply: PermissionReply): Promise<void> {\n await this.sandbox.respondPermission(permissionId, reply);\n }\n\n async rawRespondPermission(permissionId: string, response: RequestPermissionResponse): Promise<void> {\n await this.sandbox.rawRespondPermission(permissionId, response);\n }\n\n toRecord(): SessionRecord {\n return { ...this.record };\n }\n\n apply(record: SessionRecord): void {\n this.record = { ...record };\n }\n}\n\nexport class LiveAcpConnection {\n readonly connectionId: string;\n readonly agent: string;\n\n private readonly acp: AcpHttpClient;\n private readonly sessionByLocalId = new Map<string, string>();\n private readonly localByAgentSessionId = new Map<string, string>();\n private readonly pendingNewSessionLocals: string[] = [];\n private readonly pendingRequestSessionById = new Map<string, string>();\n private readonly pendingReplayByLocalSessionId = new Map<string, string>();\n private lastAdapterExit: { success: boolean; code: number | null } | null = null;\n private lastAdapterExitAt = 0;\n\n private readonly onObservedEnvelope: (\n connection: LiveAcpConnection,\n envelope: AnyMessage,\n direction: AcpEnvelopeDirection,\n localSessionId: string | null,\n ) => void;\n private readonly onPermissionRequest: (\n connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ) => Promise<RequestPermissionResponse>;\n\n private constructor(\n agent: string,\n connectionId: string,\n acp: AcpHttpClient,\n onObservedEnvelope: (\n connection: LiveAcpConnection,\n envelope: AnyMessage,\n direction: AcpEnvelopeDirection,\n localSessionId: string | null,\n ) => void,\n onPermissionRequest: (\n connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ) => Promise<RequestPermissionResponse>,\n ) {\n this.agent = agent;\n this.connectionId = connectionId;\n this.acp = acp;\n this.onObservedEnvelope = onObservedEnvelope;\n this.onPermissionRequest = onPermissionRequest;\n }\n\n static async create(options: {\n baseUrl: string;\n token?: string;\n fetcher: typeof fetch;\n headers?: HeadersInit;\n agent: string;\n serverId: string;\n onObservedEnvelope: (\n connection: LiveAcpConnection,\n envelope: AnyMessage,\n direction: AcpEnvelopeDirection,\n localSessionId: string | null,\n ) => void;\n onPermissionRequest: (\n connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ) => Promise<RequestPermissionResponse>;\n }): Promise<LiveAcpConnection> {\n const connectionId = randomId();\n\n let live: LiveAcpConnection | null = null;\n const acp = new AcpHttpClient({\n baseUrl: options.baseUrl,\n token: options.token,\n fetch: options.fetcher,\n headers: options.headers,\n transport: {\n path: `${API_PREFIX}/acp/${encodeURIComponent(options.serverId)}`,\n bootstrapQuery: { agent: options.agent },\n },\n client: {\n requestPermission: async (request: RequestPermissionRequest) => {\n if (!live) {\n return cancelledPermissionResponse();\n }\n return live.handlePermissionRequest(request);\n },\n sessionUpdate: async (_notification: SessionNotification) => {\n // Session updates are observed via envelope persistence.\n },\n extNotification: async (method: string, params: Record<string, unknown>) => {\n if (!live) return;\n live.handleAdapterNotification(method, params);\n },\n },\n onEnvelope: (envelope, direction) => {\n if (!live) {\n return;\n }\n live.handleEnvelope(envelope, direction);\n },\n });\n\n live = new LiveAcpConnection(\n options.agent,\n connectionId,\n acp,\n options.onObservedEnvelope,\n options.onPermissionRequest,\n );\n\n const initResult = await acp.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientInfo: {\n name: \"sandbox-agent-sdk\",\n version: \"v1\",\n },\n });\n if (initResult.authMethods && initResult.authMethods.length > 0) {\n await autoAuthenticate(acp, initResult.authMethods);\n }\n return live;\n }\n\n async close(): Promise<void> {\n await this.acp.disconnect();\n }\n\n hasBoundSession(localSessionId: string, agentSessionId?: string): boolean {\n const bound = this.sessionByLocalId.get(localSessionId);\n if (!bound) {\n return false;\n }\n if (agentSessionId && bound !== agentSessionId) {\n return false;\n }\n return true;\n }\n\n bindSession(localSessionId: string, agentSessionId: string): void {\n this.sessionByLocalId.set(localSessionId, agentSessionId);\n this.localByAgentSessionId.set(agentSessionId, localSessionId);\n }\n\n queueReplay(localSessionId: string, replayText: string | null): void {\n if (!replayText) {\n this.pendingReplayByLocalSessionId.delete(localSessionId);\n return;\n }\n this.pendingReplayByLocalSessionId.set(localSessionId, replayText);\n }\n\n async createRemoteSession(\n localSessionId: string,\n sessionInit: Omit<NewSessionRequest, \"_meta\">,\n ): Promise<NewSessionResponse> {\n const createStartedAt = Date.now();\n this.pendingNewSessionLocals.push(localSessionId);\n\n try {\n const response = await this.acp.newSession(sessionInit);\n this.bindSession(localSessionId, response.sessionId);\n return response;\n } catch (error) {\n const index = this.pendingNewSessionLocals.indexOf(localSessionId);\n if (index !== -1) {\n this.pendingNewSessionLocals.splice(index, 1);\n }\n const adapterExit = this.lastAdapterExit;\n if (adapterExit && this.lastAdapterExitAt >= createStartedAt) {\n const suffix = adapterExit.code == null ? \"\" : ` (code ${adapterExit.code})`;\n throw new Error(`Agent process exited while creating session${suffix}`);\n }\n throw error;\n }\n }\n\n async sendSessionMethod(\n localSessionId: string,\n method: string,\n params: Record<string, unknown>,\n options: SessionSendOptions,\n ): Promise<unknown> {\n const agentSessionId = this.sessionByLocalId.get(localSessionId);\n if (!agentSessionId) {\n throw new Error(`session '${localSessionId}' is not bound to live ACP connection '${this.connectionId}'`);\n }\n\n const mappedParams = mapSessionParams(params, agentSessionId);\n\n if (method === \"session/prompt\") {\n const replayText = this.pendingReplayByLocalSessionId.get(localSessionId);\n if (replayText) {\n // TODO: Replace this synthesized replay text with ACP-native restore once standardized.\n this.pendingReplayByLocalSessionId.delete(localSessionId);\n injectReplayPrompt(mappedParams, replayText);\n }\n\n if (options.notification) {\n await this.acp.extNotification(method, mappedParams);\n return undefined;\n }\n\n return this.acp.prompt(mappedParams as PromptRequest);\n }\n\n if (method === \"session/cancel\") {\n await this.acp.cancel(mappedParams as CancelNotification);\n return undefined;\n }\n\n if (method === \"session/set_mode\") {\n return this.acp.setSessionMode(mappedParams as SetSessionModeRequest);\n }\n\n if (method === \"session/set_config_option\") {\n return this.acp.setSessionConfigOption(mappedParams as SetSessionConfigOptionRequest);\n }\n\n if (options.notification) {\n await this.acp.extNotification(method, mappedParams);\n return undefined;\n }\n\n return this.acp.extMethod(method, mappedParams);\n }\n\n private handleEnvelope(envelope: AnyMessage, direction: AcpEnvelopeDirection): void {\n const localSessionId = this.resolveSessionId(envelope, direction);\n this.onObservedEnvelope(this, envelope, direction, localSessionId);\n }\n\n private handleAdapterNotification(method: string, params: Record<string, unknown>): void {\n if (method !== \"_adapter/agent_exited\") {\n return;\n }\n this.lastAdapterExit = {\n success: params.success === true,\n code: typeof params.code === \"number\" ? params.code : null,\n };\n this.lastAdapterExitAt = Date.now();\n }\n\n private async handlePermissionRequest(\n request: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> {\n const agentSessionId = request.sessionId;\n const localSessionId = this.localByAgentSessionId.get(agentSessionId);\n if (!localSessionId) {\n return cancelledPermissionResponse();\n }\n\n return this.onPermissionRequest(\n this,\n localSessionId,\n agentSessionId,\n clonePermissionRequest(request),\n );\n }\n\n private resolveSessionId(envelope: AnyMessage, direction: AcpEnvelopeDirection): string | null {\n const id = envelopeId(envelope);\n const method = envelopeMethod(envelope);\n\n if (direction === \"outbound\") {\n if (id && method === \"session/new\") {\n const localSessionId = this.pendingNewSessionLocals.shift() ?? null;\n if (localSessionId) {\n this.pendingRequestSessionById.set(id, localSessionId);\n }\n return localSessionId;\n }\n\n const localFromParams = this.localFromEnvelopeParams(envelope);\n if (id && localFromParams) {\n this.pendingRequestSessionById.set(id, localFromParams);\n }\n return localFromParams;\n }\n\n if (id) {\n const pending = this.pendingRequestSessionById.get(id) ?? null;\n if (pending) {\n this.pendingRequestSessionById.delete(id);\n const sessionIdFromResult = envelopeSessionIdFromResult(envelope);\n if (sessionIdFromResult) {\n this.bindSession(pending, sessionIdFromResult);\n }\n return pending;\n }\n }\n\n return this.localFromEnvelopeParams(envelope);\n }\n\n private localFromEnvelopeParams(envelope: AnyMessage): string | null {\n const agentSessionId = envelopeSessionIdFromParams(envelope);\n if (!agentSessionId) {\n return null;\n }\n return this.localByAgentSessionId.get(agentSessionId) ?? null;\n }\n}\n\nexport class ProcessTerminalSession {\n readonly socket: WebSocket;\n readonly closed: Promise<void>;\n\n private readonly readyListeners = new Set<(status: TerminalReadyStatus) => void>();\n private readonly dataListeners = new Set<(data: Uint8Array) => void>();\n private readonly exitListeners = new Set<(status: TerminalExitStatus) => void>();\n private readonly errorListeners = new Set<(error: TerminalErrorStatus | Error) => void>();\n private readonly closeListeners = new Set<() => void>();\n\n private closeSignalSent = false;\n private closedResolve!: () => void;\n\n constructor(socket: WebSocket) {\n this.socket = socket;\n this.socket.binaryType = \"arraybuffer\";\n this.closed = new Promise<void>((resolve) => {\n this.closedResolve = resolve;\n });\n\n this.socket.addEventListener(\"message\", (event) => {\n void this.handleMessage(event.data);\n });\n this.socket.addEventListener(\"error\", () => {\n this.emitError(new Error(\"Terminal websocket connection failed.\"));\n });\n this.socket.addEventListener(\"close\", () => {\n this.closedResolve();\n for (const listener of this.closeListeners) {\n listener();\n }\n });\n }\n\n onReady(listener: (status: TerminalReadyStatus) => void): () => void {\n this.readyListeners.add(listener);\n return () => {\n this.readyListeners.delete(listener);\n };\n }\n\n onData(listener: (data: Uint8Array) => void): () => void {\n this.dataListeners.add(listener);\n return () => {\n this.dataListeners.delete(listener);\n };\n }\n\n onExit(listener: (status: TerminalExitStatus) => void): () => void {\n this.exitListeners.add(listener);\n return () => {\n this.exitListeners.delete(listener);\n };\n }\n\n onError(listener: (error: TerminalErrorStatus | Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => {\n this.errorListeners.delete(listener);\n };\n }\n\n onClose(listener: () => void): () => void {\n this.closeListeners.add(listener);\n return () => {\n this.closeListeners.delete(listener);\n };\n }\n\n sendInput(data: string | ArrayBuffer | ArrayBufferView): void {\n const payload = encodeTerminalInput(data);\n this.sendFrame({\n type: \"input\",\n data: payload.data,\n encoding: payload.encoding,\n });\n }\n\n resize(payload: TerminalResizePayload): void {\n this.sendFrame({\n type: \"resize\",\n cols: payload.cols,\n rows: payload.rows,\n });\n }\n\n close(): void {\n if (this.socket.readyState === WS_READY_STATE_CONNECTING) {\n this.socket.addEventListener(\n \"open\",\n () => {\n this.close();\n },\n { once: true },\n );\n return;\n }\n\n if (this.socket.readyState === WS_READY_STATE_OPEN) {\n if (!this.closeSignalSent) {\n this.closeSignalSent = true;\n this.sendFrame({ type: \"close\" });\n }\n this.socket.close();\n return;\n }\n\n if (this.socket.readyState !== WS_READY_STATE_CLOSED) {\n this.socket.close();\n }\n }\n\n private async handleMessage(data: unknown): Promise<void> {\n try {\n if (typeof data === \"string\") {\n const frame = parseProcessTerminalServerFrame(data);\n if (!frame) {\n this.emitError(new Error(\"Received invalid terminal control frame.\"));\n return;\n }\n\n if (frame.type === \"ready\") {\n for (const listener of this.readyListeners) {\n listener(frame);\n }\n return;\n }\n\n if (frame.type === \"exit\") {\n for (const listener of this.exitListeners) {\n listener(frame);\n }\n return;\n }\n\n this.emitError(frame);\n return;\n }\n\n const bytes = await decodeTerminalBytes(data);\n for (const listener of this.dataListeners) {\n listener(bytes);\n }\n } catch (error) {\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n private sendFrame(frame: ProcessTerminalClientFrame): void {\n if (this.socket.readyState !== WS_READY_STATE_OPEN) {\n return;\n }\n\n this.socket.send(JSON.stringify(frame));\n }\n\n private emitError(error: TerminalErrorStatus | Error): void {\n for (const listener of this.errorListeners) {\n listener(error);\n }\n }\n}\n\nconst WS_READY_STATE_CONNECTING = 0;\nconst WS_READY_STATE_OPEN = 1;\nconst WS_READY_STATE_CLOSED = 3;\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 readonly healthWait: NormalizedHealthWaitOptions;\n private readonly healthWaitAbortController = new AbortController();\n\n private readonly persist: SessionPersistDriver;\n private readonly replayMaxEvents: number;\n private readonly replayMaxChars: number;\n\n private spawnHandle?: SandboxAgentSpawnHandle;\n private healthPromise?: Promise<void>;\n private healthError?: Error;\n private disposed = false;\n\n private readonly liveConnections = new Map<string, LiveAcpConnection>();\n private readonly pendingLiveConnections = new Map<string, Promise<LiveAcpConnection>>();\n private readonly sessionHandles = new Map<string, Session>();\n private readonly eventListeners = new Map<string, Set<SessionEventListener>>();\n private readonly permissionListeners = new Map<string, Set<PermissionRequestListener>>();\n private readonly pendingPermissionRequests = new Map<string, PendingPermissionRequestState>();\n private readonly nextSessionEventIndexBySession = new Map<string, number>();\n private readonly seedSessionEventIndexBySession = new Map<string, Promise<void>>();\n\n constructor(options: SandboxAgentConnectOptions) {\n const baseUrl = options.baseUrl?.trim();\n if (!baseUrl && !options.fetch) {\n throw new Error(\"baseUrl is required unless fetch is provided.\");\n }\n this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.token = options.token;\n const resolvedFetch = options.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!resolvedFetch) {\n throw new Error(\"Fetch API is not available; provide a fetch implementation.\");\n }\n this.fetcher = resolvedFetch;\n this.defaultHeaders = options.headers;\n this.healthWait = normalizeHealthWaitOptions(options.waitForHealth, options.signal);\n this.persist = options.persist ?? new InMemorySessionPersistDriver();\n\n this.replayMaxEvents = normalizePositiveInt(options.replayMaxEvents, DEFAULT_REPLAY_MAX_EVENTS);\n this.replayMaxChars = normalizePositiveInt(options.replayMaxChars, DEFAULT_REPLAY_MAX_CHARS);\n\n this.startHealthWait();\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\n const { spawnSandboxAgent } = await import(\"./spawn.js\");\n const resolvedFetch = options.fetch ?? globalThis.fetch?.bind(globalThis);\n const handle = await spawnSandboxAgent(spawnOptions, resolvedFetch);\n\n const client = new SandboxAgent({\n baseUrl: handle.baseUrl,\n token: handle.token,\n fetch: options.fetch,\n headers: options.headers,\n waitForHealth: false,\n persist: options.persist,\n replayMaxEvents: options.replayMaxEvents,\n replayMaxChars: options.replayMaxChars,\n });\n\n client.spawnHandle = handle;\n return client;\n }\n\n async dispose(): Promise<void> {\n this.disposed = true;\n this.healthWaitAbortController.abort(createAbortError(\"SandboxAgent was disposed.\"));\n\n for (const [permissionId, pending] of this.pendingPermissionRequests) {\n this.pendingPermissionRequests.delete(permissionId);\n pending.resolve(cancelledPermissionResponse());\n }\n\n const connections = [...this.liveConnections.values()];\n this.liveConnections.clear();\n const pending = [...this.pendingLiveConnections.values()];\n this.pendingLiveConnections.clear();\n\n const pendingSettled = await Promise.allSettled(pending);\n for (const item of pendingSettled) {\n if (item.status === \"fulfilled\") {\n connections.push(item.value);\n }\n }\n\n await Promise.all(\n connections.map(async (connection) => {\n await connection.close();\n }),\n );\n\n if (this.spawnHandle) {\n await this.spawnHandle.dispose();\n this.spawnHandle = undefined;\n }\n }\n\n async listSessions(request: ListPageRequest = {}): Promise<ListPage<Session>> {\n const page = await this.persist.listSessions(request);\n return {\n items: page.items.map((record) => this.upsertSessionHandle(record)),\n nextCursor: page.nextCursor,\n };\n }\n\n async getSession(id: string): Promise<Session | null> {\n const record = await this.persist.getSession(id);\n if (!record) {\n return null;\n }\n return this.upsertSessionHandle(record);\n }\n\n async getEvents(request: ListEventsRequest): Promise<ListPage<SessionEvent>> {\n return this.persist.listEvents(request);\n }\n\n async createSession(request: SessionCreateRequest): Promise<Session> {\n if (!request.agent.trim()) {\n throw new Error(\"createSession requires a non-empty agent\");\n }\n\n const localSessionId = request.id?.trim() || randomId();\n const live = await this.getLiveConnection(request.agent.trim());\n const sessionInit = normalizeSessionInit(request.sessionInit);\n\n const response = await live.createRemoteSession(localSessionId, sessionInit);\n\n const record: SessionRecord = {\n id: localSessionId,\n agent: request.agent.trim(),\n agentSessionId: response.sessionId,\n lastConnectionId: live.connectionId,\n createdAt: nowMs(),\n sessionInit,\n configOptions: cloneConfigOptions(response.configOptions),\n modes: cloneModes(response.modes),\n };\n\n await this.persist.updateSession(record);\n this.nextSessionEventIndexBySession.set(record.id, 1);\n live.bindSession(record.id, record.agentSessionId);\n let session = this.upsertSessionHandle(record);\n\n try {\n if (request.mode) {\n session = (await this.setSessionMode(session.id, request.mode)).session;\n }\n if (request.model) {\n session = (await this.setSessionModel(session.id, request.model)).session;\n }\n if (request.thoughtLevel) {\n session = (await this.setSessionThoughtLevel(session.id, request.thoughtLevel)).session;\n }\n } catch (err) {\n try {\n await this.destroySession(session.id);\n } catch {\n // Best-effort cleanup\n }\n throw err;\n }\n\n return session;\n }\n\n async resumeSession(id: string): Promise<Session> {\n const existing = await this.persist.getSession(id);\n if (!existing) {\n throw new Error(`session '${id}' not found`);\n }\n\n const live = await this.getLiveConnection(existing.agent);\n if (existing.lastConnectionId === live.connectionId && live.hasBoundSession(id, existing.agentSessionId)) {\n return this.upsertSessionHandle(existing);\n }\n\n const replaySource = await this.collectReplayEvents(existing.id, this.replayMaxEvents);\n const replayText = buildReplayText(replaySource, this.replayMaxChars);\n\n const recreated = await live.createRemoteSession(existing.id, normalizeSessionInit(existing.sessionInit));\n\n const updated: SessionRecord = {\n ...existing,\n agentSessionId: recreated.sessionId,\n lastConnectionId: live.connectionId,\n destroyedAt: undefined,\n configOptions: cloneConfigOptions(recreated.configOptions),\n modes: cloneModes(recreated.modes),\n };\n\n await this.persist.updateSession(updated);\n live.bindSession(updated.id, updated.agentSessionId);\n live.queueReplay(updated.id, replayText);\n\n return this.upsertSessionHandle(updated);\n }\n\n async resumeOrCreateSession(request: SessionResumeOrCreateRequest): Promise<Session> {\n const existing = await this.persist.getSession(request.id);\n if (existing) {\n let session = await this.resumeSession(existing.id);\n if (request.mode) {\n session = (await this.setSessionMode(session.id, request.mode)).session;\n }\n if (request.model) {\n session = (await this.setSessionModel(session.id, request.model)).session;\n }\n if (request.thoughtLevel) {\n session = (await this.setSessionThoughtLevel(session.id, request.thoughtLevel)).session;\n }\n return session;\n }\n return this.createSession(request);\n }\n\n async destroySession(id: string): Promise<Session> {\n this.cancelPendingPermissionsForSession(id);\n\n try {\n await this.sendSessionMethodInternal(id, SESSION_CANCEL_METHOD, {}, {}, true);\n } catch {\n // Best-effort: agent may already be gone\n }\n const existing = await this.requireSessionRecord(id);\n\n const updated: SessionRecord = {\n ...existing,\n destroyedAt: nowMs(),\n };\n\n await this.persist.updateSession(updated);\n return this.upsertSessionHandle(updated);\n }\n\n async setSessionMode(\n sessionId: string,\n modeId: string,\n ): Promise<{ session: Session; response: SetSessionModeResponse | void }> {\n const mode = modeId.trim();\n if (!mode) {\n throw new Error(\"setSessionMode requires a non-empty modeId\");\n }\n\n const record = await this.requireSessionRecord(sessionId);\n const knownModeIds = extractKnownModeIds(record.modes);\n if (knownModeIds.length > 0 && !knownModeIds.includes(mode)) {\n throw new UnsupportedSessionValueError(sessionId, \"mode\", \"mode\", mode, knownModeIds);\n }\n\n try {\n return (await this.sendSessionMethodInternal(\n sessionId,\n \"session/set_mode\",\n { modeId: mode },\n {},\n false,\n )) as { session: Session; response: SetSessionModeResponse | void };\n } catch (error) {\n if (!(error instanceof AcpRpcError) || error.code !== -32601) {\n throw error;\n }\n return this.setSessionCategoryValue(sessionId, \"mode\", mode);\n }\n }\n\n async setSessionConfigOption(\n sessionId: string,\n configId: string,\n value: string,\n ): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n const resolvedConfigId = configId.trim();\n if (!resolvedConfigId) {\n throw new Error(\"setSessionConfigOption requires a non-empty configId\");\n }\n const resolvedValue = value.trim();\n if (!resolvedValue) {\n throw new Error(\"setSessionConfigOption requires a non-empty value\");\n }\n\n const options = await this.getSessionConfigOptions(sessionId);\n const option = findConfigOptionById(options, resolvedConfigId);\n if (!option) {\n throw new UnsupportedSessionConfigOptionError(\n sessionId,\n resolvedConfigId,\n options.map((item) => item.id),\n );\n }\n\n const allowedValues = extractConfigValues(option);\n if (allowedValues.length > 0 && !allowedValues.includes(resolvedValue)) {\n throw new UnsupportedSessionValueError(\n sessionId,\n option.category ?? \"uncategorized\",\n option.id,\n resolvedValue,\n allowedValues,\n );\n }\n\n return (await this.sendSessionMethodInternal(\n sessionId,\n \"session/set_config_option\",\n {\n configId: resolvedConfigId,\n value: resolvedValue,\n },\n {},\n false,\n )) as { session: Session; response: SetSessionConfigOptionResponse };\n }\n\n async setSessionModel(\n sessionId: string,\n model: string,\n ): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n return this.setSessionCategoryValue(sessionId, \"model\", model);\n }\n\n async setSessionThoughtLevel(\n sessionId: string,\n thoughtLevel: string,\n ): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n return this.setSessionCategoryValue(sessionId, \"thought_level\", thoughtLevel);\n }\n\n async getSessionConfigOptions(sessionId: string): Promise<SessionConfigOption[]> {\n const record = await this.requireSessionRecord(sessionId);\n const hydrated = await this.hydrateSessionConfigOptions(record.id, record);\n return cloneConfigOptions(hydrated.configOptions) ?? [];\n }\n\n async getSessionModes(sessionId: string): Promise<SessionModeState | null> {\n const record = await this.requireSessionRecord(sessionId);\n if (record.modes && record.modes.availableModes.length > 0) {\n return cloneModes(record.modes);\n }\n\n const hydrated = await this.hydrateSessionConfigOptions(record.id, record);\n if (hydrated.modes && hydrated.modes.availableModes.length > 0) {\n return cloneModes(hydrated.modes);\n }\n\n const derived = deriveModesFromConfigOptions(hydrated.configOptions);\n if (!derived) {\n return cloneModes(hydrated.modes);\n }\n\n const updated: SessionRecord = {\n ...hydrated,\n modes: derived,\n };\n await this.persist.updateSession(updated);\n return cloneModes(derived);\n }\n\n private async setSessionCategoryValue(\n sessionId: string,\n category: string,\n value: string,\n ): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n const resolvedValue = value.trim();\n if (!resolvedValue) {\n throw new Error(`setSession${toTitleCase(category)} requires a non-empty value`);\n }\n\n const options = await this.getSessionConfigOptions(sessionId);\n const option = findConfigOptionByCategory(options, category);\n if (!option) {\n const categories = uniqueCategories(options);\n throw new UnsupportedSessionCategoryError(sessionId, category, categories);\n }\n\n const allowedValues = extractConfigValues(option);\n if (allowedValues.length > 0 && !allowedValues.includes(resolvedValue)) {\n throw new UnsupportedSessionValueError(\n sessionId,\n category,\n option.id,\n resolvedValue,\n allowedValues,\n );\n }\n\n return this.setSessionConfigOption(sessionId, option.id, resolvedValue);\n }\n\n private async hydrateSessionConfigOptions(sessionId: string, snapshot: SessionRecord): Promise<SessionRecord> {\n if (snapshot.configOptions !== undefined) {\n return snapshot;\n }\n\n const info = await this.getAgent(snapshot.agent, { config: true });\n const configOptions = normalizeSessionConfigOptions(info.configOptions) ?? [];\n // Re-read the record from persistence so we merge against the latest\n // state, not a stale snapshot captured before the network await.\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n return { ...snapshot, configOptions };\n }\n const updated: SessionRecord = {\n ...record,\n configOptions,\n };\n await this.persist.updateSession(updated);\n return updated;\n }\n\n async rawSendSessionMethod(\n sessionId: string,\n method: string,\n params: Record<string, unknown>,\n options: SessionSendOptions = {},\n ): Promise<{ session: Session; response: unknown }> {\n return this.sendSessionMethodInternal(sessionId, method, params, options, false);\n }\n\n private async sendSessionMethodInternal(\n sessionId: string,\n method: string,\n params: Record<string, unknown>,\n options: SessionSendOptions,\n allowManagedCancel: boolean,\n ): Promise<{ session: Session; response: unknown }> {\n if (method === SESSION_CANCEL_METHOD && !allowManagedCancel) {\n throw new Error(MANUAL_CANCEL_ERROR);\n }\n\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n throw new Error(`session '${sessionId}' not found`);\n }\n\n const live = await this.getLiveConnection(record.agent);\n if (!live.hasBoundSession(record.id, record.agentSessionId)) {\n // The persisted session points at a stale connection; restore lazily.\n const restored = await this.resumeSession(record.id);\n return this.sendSessionMethodInternal(restored.id, method, params, options, allowManagedCancel);\n }\n\n const response = await live.sendSessionMethod(record.id, method, params, options);\n await this.persistSessionStateFromMethod(record.id, method, params, response);\n const refreshed = await this.requireSessionRecord(record.id);\n return {\n session: this.upsertSessionHandle(refreshed),\n response,\n };\n }\n\n private async persistSessionStateFromMethod(\n sessionId: string,\n method: string,\n params: Record<string, unknown>,\n response: unknown,\n ): Promise<void> {\n // Re-read the record from persistence so we merge against the latest\n // state, not a stale snapshot captured before the RPC await.\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n return;\n }\n\n if (method === \"session/set_config_option\") {\n const configId = typeof params.configId === \"string\" ? params.configId : null;\n const value = typeof params.value === \"string\" ? params.value : null;\n const updates: Partial<SessionRecord> = {};\n\n const serverConfigOptions = extractConfigOptionsFromSetResponse(response);\n if (serverConfigOptions) {\n updates.configOptions = cloneConfigOptions(serverConfigOptions);\n } else if (record.configOptions && configId && value) {\n // Server didn't return configOptions — optimistically update the\n // cached currentValue so subsequent getConfigOptions() reflects the\n // change without a round-trip.\n const updated = applyConfigOptionValue(record.configOptions, configId, value);\n if (updated) {\n updates.configOptions = updated;\n }\n }\n\n // When a mode-category config option is set via set_config_option\n // (fallback path from setSessionMode), keep modes.currentModeId in sync.\n if (configId && value) {\n const source = updates.configOptions ?? record.configOptions;\n const option = source ? findConfigOptionById(source, configId) : null;\n if (option?.category === \"mode\") {\n const nextModes = applyCurrentMode(record.modes, value);\n if (nextModes) {\n updates.modes = nextModes;\n }\n }\n }\n\n if (Object.keys(updates).length > 0) {\n await this.persist.updateSession({ ...record, ...updates });\n }\n return;\n }\n\n if (method === \"session/set_mode\") {\n const modeId = typeof params.modeId === \"string\" ? params.modeId : null;\n if (!modeId) {\n return;\n }\n const updates: Partial<SessionRecord> = {};\n const nextModes = applyCurrentMode(record.modes, modeId);\n if (nextModes) {\n updates.modes = nextModes;\n }\n // Keep configOptions mode-category currentValue in sync with the new\n // mode, mirroring the reverse sync in the set_config_option path above.\n if (record.configOptions) {\n const modeOption = findConfigOptionByCategory(record.configOptions, \"mode\");\n if (modeOption) {\n const updated = applyConfigOptionValue(record.configOptions, modeOption.id, modeId);\n if (updated) {\n updates.configOptions = updated;\n }\n }\n }\n if (Object.keys(updates).length > 0) {\n await this.persist.updateSession({ ...record, ...updates });\n }\n }\n }\n\n onSessionEvent(sessionId: string, listener: SessionEventListener): () => void {\n const listeners = this.eventListeners.get(sessionId) ?? new Set<SessionEventListener>();\n listeners.add(listener);\n this.eventListeners.set(sessionId, listeners);\n\n return () => {\n const set = this.eventListeners.get(sessionId);\n if (!set) {\n return;\n }\n set.delete(listener);\n if (set.size === 0) {\n this.eventListeners.delete(sessionId);\n }\n };\n }\n\n onPermissionRequest(sessionId: string, listener: PermissionRequestListener): () => void {\n const listeners = this.permissionListeners.get(sessionId) ?? new Set<PermissionRequestListener>();\n listeners.add(listener);\n this.permissionListeners.set(sessionId, listeners);\n\n return () => {\n const set = this.permissionListeners.get(sessionId);\n if (!set) {\n return;\n }\n set.delete(listener);\n if (set.size === 0) {\n this.permissionListeners.delete(sessionId);\n }\n };\n }\n\n async respondPermission(permissionId: string, reply: PermissionReply): Promise<void> {\n const pending = this.pendingPermissionRequests.get(permissionId);\n if (!pending) {\n throw new Error(`permission '${permissionId}' not found`);\n }\n\n let response: RequestPermissionResponse;\n try {\n response = permissionReplyToResponse(permissionId, pending.request, reply);\n } catch (error) {\n pending.reject(error instanceof Error ? error : new Error(String(error)));\n this.pendingPermissionRequests.delete(permissionId);\n throw error;\n }\n this.resolvePendingPermission(permissionId, response);\n }\n\n async rawRespondPermission(permissionId: string, response: RequestPermissionResponse): Promise<void> {\n if (!this.pendingPermissionRequests.has(permissionId)) {\n throw new Error(`permission '${permissionId}' not found`);\n }\n this.resolvePendingPermission(permissionId, clonePermissionResponse(response));\n }\n\n async getHealth(): Promise<HealthResponse> {\n return this.requestHealth();\n }\n\n async listAgents(options?: AgentQueryOptions): Promise<AgentListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/agents`, {\n query: toAgentQuery(options),\n });\n }\n\n async getAgent(agent: string, options?: AgentQueryOptions): Promise<AgentInfo> {\n try {\n return await this.requestJson(\"GET\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}`, {\n query: toAgentQuery(options),\n });\n } catch (error) {\n if (!(error instanceof SandboxAgentError) || error.status !== 404) {\n throw error;\n }\n\n const listed = await this.listAgents(options);\n const match = listed.agents.find((entry) => entry.id === agent);\n if (match) {\n return match;\n }\n throw error;\n }\n }\n\n async installAgent(agent: string, request: AgentInstallRequest = {}): Promise<AgentInstallResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/install`, {\n body: request,\n });\n }\n\n async listAcpServers(): Promise<AcpServerListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/acp`);\n }\n\n async listFsEntries(query: FsEntriesQuery = {}): Promise<FsEntry[]> {\n return this.requestJson(\"GET\", `${FS_PATH}/entries`, {\n query,\n });\n }\n\n async readFsFile(query: FsPathQuery): Promise<Uint8Array> {\n const response = await this.requestRaw(\"GET\", `${FS_PATH}/file`, {\n query,\n accept: \"application/octet-stream\",\n });\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n async writeFsFile(query: FsPathQuery, body: BodyInit): Promise<FsWriteResponse> {\n const response = await this.requestRaw(\"PUT\", `${FS_PATH}/file`, {\n query,\n rawBody: body,\n contentType: \"application/octet-stream\",\n accept: \"application/json\",\n });\n return (await response.json()) as FsWriteResponse;\n }\n\n async deleteFsEntry(query: FsDeleteQuery): Promise<FsActionResponse> {\n return this.requestJson(\"DELETE\", `${FS_PATH}/entry`, { query });\n }\n\n async mkdirFs(query: FsPathQuery): Promise<FsActionResponse> {\n return this.requestJson(\"POST\", `${FS_PATH}/mkdir`, { query });\n }\n\n async moveFs(request: FsMoveRequest): Promise<FsMoveResponse> {\n return this.requestJson(\"POST\", `${FS_PATH}/move`, { body: request });\n }\n\n async statFs(query: FsPathQuery): Promise<FsStat> {\n return this.requestJson(\"GET\", `${FS_PATH}/stat`, { query });\n }\n\n async uploadFsBatch(body: BodyInit, query?: FsUploadBatchQuery): Promise<FsUploadBatchResponse> {\n const response = await this.requestRaw(\"POST\", `${FS_PATH}/upload-batch`, {\n query,\n rawBody: body,\n contentType: \"application/x-tar\",\n accept: \"application/json\",\n });\n return (await response.json()) as FsUploadBatchResponse;\n }\n\n async getMcpConfig(query: McpConfigQuery): Promise<McpServerConfig> {\n return this.requestJson(\"GET\", `${API_PREFIX}/config/mcp`, { query });\n }\n\n async setMcpConfig(query: McpConfigQuery, config: McpServerConfig): Promise<void> {\n await this.requestRaw(\"PUT\", `${API_PREFIX}/config/mcp`, { query, body: config });\n }\n\n async deleteMcpConfig(query: McpConfigQuery): Promise<void> {\n await this.requestRaw(\"DELETE\", `${API_PREFIX}/config/mcp`, { query });\n }\n\n async getSkillsConfig(query: SkillsConfigQuery): Promise<SkillsConfig> {\n return this.requestJson(\"GET\", `${API_PREFIX}/config/skills`, { query });\n }\n\n async setSkillsConfig(query: SkillsConfigQuery, config: SkillsConfig): Promise<void> {\n await this.requestRaw(\"PUT\", `${API_PREFIX}/config/skills`, { query, body: config });\n }\n\n async deleteSkillsConfig(query: SkillsConfigQuery): Promise<void> {\n await this.requestRaw(\"DELETE\", `${API_PREFIX}/config/skills`, { query });\n }\n\n async getProcessConfig(): Promise<ProcessConfig> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes/config`);\n }\n\n async setProcessConfig(config: ProcessConfig): Promise<ProcessConfig> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/config`, {\n body: config,\n });\n }\n\n async createProcess(request: ProcessCreateRequest): Promise<ProcessInfo> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes`, {\n body: request,\n });\n }\n\n async runProcess(request: ProcessRunRequest): Promise<ProcessRunResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/run`, {\n body: request,\n });\n }\n\n async listProcesses(): Promise<ProcessListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes`);\n }\n\n async getProcess(id: string): Promise<ProcessInfo> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes/${encodeURIComponent(id)}`);\n }\n\n async stopProcess(id: string, query?: ProcessSignalQuery): Promise<ProcessInfo> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/stop`, {\n query,\n });\n }\n\n async killProcess(id: string, query?: ProcessSignalQuery): Promise<ProcessInfo> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/kill`, {\n query,\n });\n }\n\n async deleteProcess(id: string): Promise<void> {\n await this.requestRaw(\"DELETE\", `${API_PREFIX}/processes/${encodeURIComponent(id)}`);\n }\n\n async getProcessLogs(id: string, query: ProcessLogFollowQuery = {}): Promise<ProcessLogsResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/logs`, {\n query,\n });\n }\n\n async followProcessLogs(\n id: string,\n listener: ProcessLogListener,\n query: ProcessLogFollowQuery = {},\n ): Promise<ProcessLogSubscription> {\n const abortController = new AbortController();\n const response = await this.requestRaw(\n \"GET\",\n `${API_PREFIX}/processes/${encodeURIComponent(id)}/logs`,\n {\n query: { ...query, follow: true },\n accept: \"text/event-stream\",\n signal: abortController.signal,\n },\n );\n\n if (!response.body) {\n abortController.abort();\n throw new Error(\"SSE stream is not readable in this environment.\");\n }\n\n const closed = consumeProcessLogSse(response.body, listener, abortController.signal);\n\n return {\n close: () => abortController.abort(),\n closed,\n };\n }\n\n async sendProcessInput(id: string, request: ProcessInputRequest): Promise<ProcessInputResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/input`, {\n body: request,\n });\n }\n\n async resizeProcessTerminal(\n id: string,\n request: ProcessTerminalResizeRequest,\n ): Promise<ProcessTerminalResizeResponse> {\n return this.requestJson(\n \"POST\",\n `${API_PREFIX}/processes/${encodeURIComponent(id)}/terminal/resize`,\n {\n body: request,\n },\n );\n }\n\n buildProcessTerminalWebSocketUrl(\n id: string,\n options: ProcessTerminalWebSocketUrlOptions = {},\n ): string {\n return toWebSocketUrl(\n this.buildUrl(`${API_PREFIX}/processes/${encodeURIComponent(id)}/terminal/ws`, {\n access_token: options.accessToken ?? this.token,\n }),\n );\n }\n\n connectProcessTerminalWebSocket(\n id: string,\n options: ProcessTerminalConnectOptions = {},\n ): WebSocket {\n const WebSocketCtor = options.WebSocket ?? globalThis.WebSocket;\n if (!WebSocketCtor) {\n throw new Error(\"WebSocket API is not available; provide a WebSocket implementation.\");\n }\n\n return new WebSocketCtor(\n this.buildProcessTerminalWebSocketUrl(id, {\n accessToken: options.accessToken,\n }),\n options.protocols,\n );\n }\n\n connectProcessTerminal(\n id: string,\n options: ProcessTerminalSessionOptions = {},\n ): ProcessTerminalSession {\n return new ProcessTerminalSession(this.connectProcessTerminalWebSocket(id, options));\n }\n\n private async getLiveConnection(agent: string): Promise<LiveAcpConnection> {\n await this.awaitHealthy();\n\n const existing = this.liveConnections.get(agent);\n if (existing) {\n return existing;\n }\n\n const pending = this.pendingLiveConnections.get(agent);\n if (pending) {\n return pending;\n }\n\n const creating = (async () => {\n const serverId = `sdk-${agent}-${randomId()}`;\n const created = await LiveAcpConnection.create({\n baseUrl: this.baseUrl,\n token: this.token,\n fetcher: this.fetcher,\n headers: this.defaultHeaders,\n agent,\n serverId,\n onObservedEnvelope: (connection, envelope, direction, localSessionId) => {\n void this.persistObservedEnvelope(connection, envelope, direction, localSessionId);\n },\n onPermissionRequest: async (connection, localSessionId, agentSessionId, request) =>\n this.enqueuePermissionRequest(connection, localSessionId, agentSessionId, request),\n });\n\n const raced = this.liveConnections.get(agent);\n if (raced) {\n await created.close();\n return raced;\n }\n\n this.liveConnections.set(agent, created);\n return created;\n })();\n\n this.pendingLiveConnections.set(agent, creating);\n try {\n return await creating;\n } finally {\n if (this.pendingLiveConnections.get(agent) === creating) {\n this.pendingLiveConnections.delete(agent);\n }\n }\n }\n\n private async persistObservedEnvelope(\n connection: LiveAcpConnection,\n envelope: AnyMessage,\n direction: AcpEnvelopeDirection,\n localSessionId: string | null,\n ): Promise<void> {\n if (!localSessionId) {\n return;\n }\n\n const event: SessionEvent = {\n id: randomId(),\n eventIndex: await this.allocateSessionEventIndex(localSessionId),\n sessionId: localSessionId,\n createdAt: nowMs(),\n connectionId: connection.connectionId,\n sender: direction === \"outbound\" ? \"client\" : \"agent\",\n payload: cloneEnvelope(envelope),\n };\n\n await this.persist.insertEvent(event);\n await this.persistSessionStateFromEvent(localSessionId, envelope, direction);\n\n const listeners = this.eventListeners.get(localSessionId);\n if (!listeners || listeners.size === 0) {\n return;\n }\n\n for (const listener of listeners) {\n listener(event);\n }\n }\n\n private async persistSessionStateFromEvent(\n sessionId: string,\n envelope: AnyMessage,\n direction: AcpEnvelopeDirection,\n ): Promise<void> {\n if (direction !== \"inbound\") {\n return;\n }\n\n if (envelopeMethod(envelope) !== \"session/update\") {\n return;\n }\n\n const update = envelopeSessionUpdate(envelope);\n if (!update || typeof update.sessionUpdate !== \"string\") {\n return;\n }\n\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n return;\n }\n\n if (update.sessionUpdate === \"config_option_update\") {\n const configOptions = normalizeSessionConfigOptions(update.configOptions);\n if (configOptions) {\n await this.persist.updateSession({\n ...record,\n configOptions,\n });\n }\n return;\n }\n\n if (update.sessionUpdate === \"current_mode_update\") {\n const modeId = typeof update.currentModeId === \"string\" ? update.currentModeId : null;\n if (!modeId) {\n return;\n }\n const nextModes = applyCurrentMode(record.modes, modeId);\n if (!nextModes) {\n return;\n }\n await this.persist.updateSession({\n ...record,\n modes: nextModes,\n });\n }\n }\n\n private async allocateSessionEventIndex(sessionId: string): Promise<number> {\n await this.ensureSessionEventIndexSeeded(sessionId);\n const nextIndex = this.nextSessionEventIndexBySession.get(sessionId) ?? 1;\n this.nextSessionEventIndexBySession.set(sessionId, nextIndex + 1);\n return nextIndex;\n }\n\n private async ensureSessionEventIndexSeeded(sessionId: string): Promise<void> {\n if (this.nextSessionEventIndexBySession.has(sessionId)) {\n return;\n }\n\n if (!this.seedSessionEventIndexBySession.has(sessionId)) {\n const pending = (async () => {\n const maxPersistedIndex = await this.findMaxPersistedSessionEventIndex(sessionId);\n this.nextSessionEventIndexBySession.set(sessionId, Math.max(1, maxPersistedIndex + 1));\n })().finally(() => {\n this.seedSessionEventIndexBySession.delete(sessionId);\n });\n this.seedSessionEventIndexBySession.set(sessionId, pending);\n }\n\n const pending = this.seedSessionEventIndexBySession.get(sessionId);\n if (pending) {\n await pending;\n }\n }\n\n private async findMaxPersistedSessionEventIndex(sessionId: string): Promise<number> {\n let maxIndex = 0;\n let eventCursor: string | undefined;\n\n while (true) {\n const eventsPage = await this.persist.listEvents({\n sessionId,\n cursor: eventCursor,\n limit: EVENT_INDEX_SCAN_EVENTS_LIMIT,\n });\n\n for (const event of eventsPage.items) {\n if (Number.isFinite(event.eventIndex) && event.eventIndex > maxIndex) {\n maxIndex = Math.floor(event.eventIndex);\n }\n }\n\n if (!eventsPage.nextCursor) {\n break;\n }\n eventCursor = eventsPage.nextCursor;\n }\n\n return maxIndex;\n }\n\n private async collectReplayEvents(sessionId: string, maxEvents: number): Promise<SessionEvent[]> {\n const all: SessionEvent[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const page = await this.persist.listEvents({\n sessionId,\n cursor,\n limit: Math.max(100, maxEvents),\n });\n\n all.push(...page.items);\n\n if (!page.nextCursor) {\n break;\n }\n\n cursor = page.nextCursor;\n }\n\n return all.slice(-maxEvents);\n }\n\n private upsertSessionHandle(record: SessionRecord): Session {\n const existing = this.sessionHandles.get(record.id);\n if (existing) {\n existing.apply(record);\n return existing;\n }\n\n const created = new Session(this, record);\n this.sessionHandles.set(record.id, created);\n return created;\n }\n\n private async requireSessionRecord(id: string): Promise<SessionRecord> {\n const record = await this.persist.getSession(id);\n if (!record) {\n throw new Error(`session '${id}' not found`);\n }\n return record;\n }\n\n private async enqueuePermissionRequest(\n _connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> {\n const listeners = this.permissionListeners.get(localSessionId);\n if (!listeners || listeners.size === 0) {\n return cancelledPermissionResponse();\n }\n\n const pendingId = randomId();\n const permissionRequest: SessionPermissionRequest = {\n id: pendingId,\n createdAt: nowMs(),\n sessionId: localSessionId,\n agentSessionId,\n availableReplies: availablePermissionReplies(request.options),\n options: request.options.map(clonePermissionOption),\n toolCall: clonePermissionToolCall(request.toolCall),\n rawRequest: clonePermissionRequest(request),\n };\n\n return await new Promise<RequestPermissionResponse>((resolve, reject) => {\n this.pendingPermissionRequests.set(pendingId, {\n id: pendingId,\n sessionId: localSessionId,\n request: clonePermissionRequest(request),\n resolve,\n reject,\n });\n\n try {\n for (const listener of listeners) {\n listener(permissionRequest);\n }\n } catch (error) {\n this.pendingPermissionRequests.delete(pendingId);\n reject(error);\n }\n });\n }\n\n private resolvePendingPermission(permissionId: string, response: RequestPermissionResponse): void {\n const pending = this.pendingPermissionRequests.get(permissionId);\n if (!pending) {\n throw new Error(`permission '${permissionId}' not found`);\n }\n\n this.pendingPermissionRequests.delete(permissionId);\n pending.resolve(response);\n }\n\n private cancelPendingPermissionsForSession(sessionId: string): void {\n for (const [permissionId, pending] of this.pendingPermissionRequests) {\n if (pending.sessionId !== sessionId) {\n continue;\n }\n this.pendingPermissionRequests.delete(permissionId);\n pending.resolve(cancelledPermissionResponse());\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 signal: options.signal,\n skipReadyWait: options.skipReadyWait,\n });\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n }\n\n private async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n if (!options.skipReadyWait) {\n await this.awaitHealthy(options.signal);\n }\n\n const url = this.buildUrl(path, options.query);\n const headers = this.buildHeaders(options.headers);\n\n if (options.accept) {\n headers.set(\"Accept\", options.accept);\n }\n\n const init: RequestInit = {\n method,\n headers,\n signal: options.signal,\n };\n\n if (options.rawBody !== undefined && options.body !== undefined) {\n throw new Error(\"requestRaw received both rawBody and body\");\n }\n\n if (options.rawBody !== undefined) {\n if (options.contentType) {\n headers.set(\"Content-Type\", options.contentType);\n }\n init.body = options.rawBody;\n } else if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n init.body = JSON.stringify(options.body);\n }\n\n const response = await this.fetcher(url, init);\n if (!response.ok) {\n const problem = await readProblem(response);\n throw new SandboxAgentError(response.status, problem, response);\n }\n\n return response;\n }\n\n private startHealthWait(): void {\n if (!this.healthWait.enabled || this.healthPromise) {\n return;\n }\n\n this.healthPromise = this.runHealthWait().catch((error) => {\n this.healthError = error instanceof Error ? error : new Error(String(error));\n });\n }\n\n private async awaitHealthy(signal?: AbortSignal): Promise<void> {\n if (!this.healthPromise) {\n throwIfAborted(signal);\n return;\n }\n\n await waitForAbortable(this.healthPromise, signal);\n throwIfAborted(signal);\n if (this.healthError) {\n throw this.healthError;\n }\n }\n\n private async runHealthWait(): Promise<void> {\n const signal = this.healthWait.enabled\n ? anyAbortSignal([this.healthWait.signal, this.healthWaitAbortController.signal])\n : undefined;\n const startedAt = Date.now();\n const deadline =\n typeof this.healthWait.timeoutMs === \"number\" ? startedAt + this.healthWait.timeoutMs : undefined;\n\n let delayMs = HEALTH_WAIT_MIN_DELAY_MS;\n let nextLogAt = startedAt + HEALTH_WAIT_LOG_AFTER_MS;\n let lastError: unknown;\n\n while (!this.disposed && (deadline === undefined || Date.now() < deadline)) {\n throwIfAborted(signal);\n\n try {\n const health = await this.requestHealth({ signal });\n if (health.status === \"ok\") {\n return;\n }\n lastError = new Error(`Unexpected health response: ${JSON.stringify(health)}`);\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n lastError = error;\n }\n\n const now = Date.now();\n if (now >= nextLogAt) {\n const details = formatHealthWaitError(lastError);\n console.warn(\n `sandbox-agent at ${this.baseUrl} is not healthy after ${now - startedAt}ms; still waiting (${details})`,\n );\n nextLogAt = now + HEALTH_WAIT_LOG_EVERY_MS;\n }\n\n await sleep(delayMs, signal);\n delayMs = Math.min(HEALTH_WAIT_MAX_DELAY_MS, delayMs * 2);\n }\n\n if (this.disposed) {\n return;\n }\n\n throw new Error(\n `Timed out waiting for sandbox-agent health after ${this.healthWait.timeoutMs}ms (${formatHealthWaitError(lastError)})`,\n );\n }\n\n private buildHeaders(extra?: HeadersInit): Headers {\n const headers = new Headers(this.defaultHeaders ?? undefined);\n\n if (this.token) {\n headers.set(\"Authorization\", `Bearer ${this.token}`);\n }\n\n if (extra) {\n const merged = new Headers(extra);\n merged.forEach((value, key) => headers.set(key, value));\n }\n\n return headers;\n }\n\n private buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n\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\n return url.toString();\n }\n\n private async requestHealth(options: { signal?: AbortSignal } = {}): Promise<HealthResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/health`, {\n signal: options.signal,\n skipReadyWait: true,\n });\n }\n}\n\ntype PendingPermissionRequestState = {\n id: string;\n sessionId: string;\n request: RequestPermissionRequest;\n resolve: (response: RequestPermissionResponse) => void;\n reject: (reason?: unknown) => void;\n};\n\ntype QueryValue = string | number | boolean | null | undefined;\n\ntype RequestOptions = {\n query?: Record<string, QueryValue>;\n body?: unknown;\n rawBody?: BodyInit;\n contentType?: string;\n headers?: HeadersInit;\n accept?: string;\n signal?: AbortSignal;\n skipReadyWait?: boolean;\n};\n\ntype NormalizedHealthWaitOptions =\n | { enabled: false; timeoutMs?: undefined; signal?: undefined }\n | { enabled: true; timeoutMs?: number; signal?: AbortSignal };\n\nfunction parseProcessTerminalServerFrame(payload: string): ProcessTerminalServerFrame | null {\n try {\n const parsed = JSON.parse(payload) as unknown;\n if (!isRecord(parsed) || typeof parsed.type !== \"string\") {\n return null;\n }\n\n if (parsed.type === \"ready\" && typeof parsed.processId === \"string\") {\n return parsed as ProcessTerminalServerFrame;\n }\n\n if (\n parsed.type === \"exit\" &&\n (parsed.exitCode === undefined ||\n parsed.exitCode === null ||\n typeof parsed.exitCode === \"number\")\n ) {\n return parsed as ProcessTerminalServerFrame;\n }\n\n if (parsed.type === \"error\" && typeof parsed.message === \"string\") {\n return parsed as ProcessTerminalServerFrame;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction encodeTerminalInput(\n data: string | ArrayBuffer | ArrayBufferView,\n): { data: string; encoding?: \"base64\" } {\n if (typeof data === \"string\") {\n return { data };\n }\n\n const bytes = encodeTerminalBytes(data);\n return {\n data: bytesToBase64(bytes),\n encoding: \"base64\",\n };\n}\n\nfunction encodeTerminalBytes(data: ArrayBuffer | ArrayBufferView): Uint8Array {\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice();\n}\n\nasync function decodeTerminalBytes(data: unknown): Promise<Uint8Array> {\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice();\n }\n\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer());\n }\n\n throw new Error(`Unsupported terminal frame payload: ${String(data)}`);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n\n if (typeof btoa === \"function\") {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize));\n }\n return btoa(binary);\n }\n\n throw new Error(\"Base64 encoding is not available in this environment.\");\n}\n\n/**\n * Auto-select and call `authenticate` based on the agent's advertised auth methods.\n * Prefers env-var-based methods that the server process already has configured.\n */\nasync function autoAuthenticate(acp: AcpHttpClient, methods: AuthMethod[]): Promise<void> {\n // Only attempt env-var-based methods that the server process can satisfy\n // automatically. Interactive methods (e.g. \"claude-login\") cannot be\n // fulfilled programmatically and must be skipped.\n const envBased = methods.find(\n (m) =>\n m.id === \"codex-api-key\" ||\n m.id === \"openai-api-key\" ||\n m.id === \"anthropic-api-key\",\n );\n\n if (!envBased) {\n return;\n }\n\n try {\n await acp.authenticate({ methodId: envBased.id });\n } catch {\n // Authentication is best-effort; the agent may already have credentials\n // from env vars or credential files configured on the server side.\n }\n}\n\nfunction toAgentQuery(options: AgentQueryOptions | undefined): Record<string, QueryValue> | undefined {\n if (!options) {\n return undefined;\n }\n\n return {\n config: options.config,\n no_cache: options.noCache,\n };\n}\n\nfunction normalizeSessionInit(\n value: Omit<NewSessionRequest, \"_meta\"> | undefined,\n): Omit<NewSessionRequest, \"_meta\"> {\n if (!value) {\n return {\n cwd: defaultCwd(),\n mcpServers: [],\n };\n }\n\n return {\n ...value,\n cwd: value.cwd ?? defaultCwd(),\n mcpServers: value.mcpServers ?? [],\n };\n}\n\nfunction mapSessionParams(params: Record<string, unknown>, agentSessionId: string): Record<string, unknown> {\n return {\n ...params,\n sessionId: agentSessionId,\n };\n}\n\nfunction injectReplayPrompt(params: Record<string, unknown>, replayText: string): void {\n const prompt = Array.isArray(params.prompt) ? [...params.prompt] : [];\n prompt.unshift({\n type: \"text\",\n text: replayText,\n });\n params.prompt = prompt;\n}\n\nfunction buildReplayText(events: SessionEvent[], maxChars: number): string | null {\n if (events.length === 0) {\n return null;\n }\n\n const prefix =\n \"Previous session history is replayed below as JSON-RPC envelopes. Use it as context before responding to the latest user prompt.\\n\";\n let text = prefix;\n\n for (const event of events) {\n const line = JSON.stringify({\n createdAt: event.createdAt,\n sender: event.sender,\n payload: event.payload,\n });\n\n if (text.length + line.length + 1 > maxChars) {\n text += \"\\n[history truncated]\";\n break;\n }\n\n text += `${line}\\n`;\n }\n\n return text;\n}\n\nfunction envelopeMethod(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"method\" in message) || typeof message[\"method\"] !== \"string\") {\n return null;\n }\n return message[\"method\"];\n}\n\nfunction envelopeId(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"id\" in message) || message[\"id\"] === undefined || message[\"id\"] === null) {\n return null;\n }\n return String(message[\"id\"]);\n}\n\nfunction envelopeSessionIdFromParams(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"params\" in message) || !isRecord(message[\"params\"])) {\n return null;\n }\n\n const params = message[\"params\"];\n if (typeof params.sessionId === \"string\" && params.sessionId.length > 0) {\n return params.sessionId;\n }\n\n return null;\n}\n\nfunction envelopeSessionIdFromResult(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"result\" in message) || !isRecord(message[\"result\"])) {\n return null;\n }\n\n const result = message[\"result\"];\n if (typeof result.sessionId === \"string\" && result.sessionId.length > 0) {\n return result.sessionId;\n }\n\n return null;\n}\n\nfunction cloneEnvelope(envelope: AnyMessage): AnyMessage {\n return JSON.parse(JSON.stringify(envelope)) as AnyMessage;\n}\n\nfunction clonePermissionRequest(request: RequestPermissionRequest): RequestPermissionRequest {\n return JSON.parse(JSON.stringify(request)) as RequestPermissionRequest;\n}\n\nfunction clonePermissionResponse(response: RequestPermissionResponse): RequestPermissionResponse {\n return JSON.parse(JSON.stringify(response)) as RequestPermissionResponse;\n}\n\nfunction clonePermissionOption(option: PermissionOption): SessionPermissionRequestOption {\n return {\n optionId: option.optionId,\n name: option.name,\n kind: option.kind,\n };\n}\n\nfunction clonePermissionToolCall(toolCall: RequestPermissionRequest[\"toolCall\"]): RequestPermissionRequest[\"toolCall\"] {\n return JSON.parse(JSON.stringify(toolCall)) as RequestPermissionRequest[\"toolCall\"];\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction randomId(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction defaultCwd(): string {\n if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n return process.cwd();\n }\n return \"/\";\n}\n\nfunction normalizePositiveInt(value: number | undefined, fallback: number): number {\n if (!Number.isFinite(value) || (value ?? 0) < 1) {\n return fallback;\n }\n return Math.floor(value as number);\n}\n\nfunction normalizeHealthWaitOptions(\n value: boolean | SandboxAgentHealthWaitOptions | undefined,\n signal: AbortSignal | undefined,\n): NormalizedHealthWaitOptions {\n if (value === false) {\n return { enabled: false };\n }\n\n if (value === true || value === undefined) {\n return { enabled: true, signal };\n }\n\n const timeoutMs =\n typeof value.timeoutMs === \"number\" && Number.isFinite(value.timeoutMs) && value.timeoutMs > 0\n ? Math.floor(value.timeoutMs)\n : undefined;\n\n return {\n enabled: true,\n signal,\n timeoutMs,\n };\n}\n\nfunction normalizeSpawnOptions(\n spawn: SandboxAgentSpawnOptions | boolean | undefined,\n defaultEnabled: boolean,\n): SandboxAgentSpawnOptions & { enabled: boolean } {\n if (spawn === false) {\n return { enabled: false };\n }\n\n if (spawn === true || spawn === undefined) {\n return { enabled: defaultEnabled };\n }\n\n return {\n ...spawn,\n enabled: spawn.enabled ?? defaultEnabled,\n };\n}\n\nasync function 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\nfunction normalizeSessionConfigOptions(value: unknown): SessionConfigOption[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const normalized = value.filter(isSessionConfigOption) as SessionConfigOption[];\n return cloneConfigOptions(normalized) ?? [];\n}\n\nfunction extractConfigOptionsFromSetResponse(response: unknown): SessionConfigOption[] | undefined {\n if (!isRecord(response)) {\n return undefined;\n }\n return normalizeSessionConfigOptions(response.configOptions);\n}\n\nfunction findConfigOptionByCategory(\n options: SessionConfigOption[],\n category: string,\n): SessionConfigOption | undefined {\n return options.find((option) => option.category === category);\n}\n\nfunction findConfigOptionById(\n options: SessionConfigOption[],\n configId: string,\n): SessionConfigOption | undefined {\n return options.find((option) => option.id === configId);\n}\n\nfunction uniqueCategories(options: SessionConfigOption[]): string[] {\n return [...new Set(options.map((option) => option.category).filter((value): value is string => !!value))].sort();\n}\n\nfunction extractConfigValues(option: SessionConfigOption): string[] {\n if (!isRecord(option) || option.type !== \"select\" || !Array.isArray(option.options)) {\n return [];\n }\n\n const values: string[] = [];\n for (const entry of option.options as unknown[]) {\n if (isRecord(entry) && typeof entry.value === \"string\") {\n values.push(entry.value);\n continue;\n }\n if (isRecord(entry) && Array.isArray(entry.options)) {\n for (const nested of entry.options) {\n if (isRecord(nested) && typeof nested.value === \"string\") {\n values.push(nested.value);\n }\n }\n }\n }\n\n return [...new Set(values)];\n}\n\nfunction extractKnownModeIds(modes: SessionModeState | null | undefined): string[] {\n if (!modes || !Array.isArray(modes.availableModes)) {\n return [];\n }\n return modes.availableModes\n .map((mode) => (typeof mode.id === \"string\" ? mode.id : null))\n .filter((value): value is string => !!value);\n}\n\nfunction deriveModesFromConfigOptions(\n configOptions: SessionConfigOption[] | undefined,\n): SessionModeState | null {\n if (!configOptions || configOptions.length === 0) {\n return null;\n }\n\n const modeOption = findConfigOptionByCategory(configOptions, \"mode\");\n if (!modeOption || !Array.isArray(modeOption.options)) {\n return null;\n }\n\n const availableModes = modeOption.options\n .flatMap((entry) => flattenConfigOptions(entry))\n .map((entry) => ({\n id: entry.value,\n name: entry.name,\n description: entry.description ?? null,\n }));\n\n return {\n currentModeId:\n typeof modeOption.currentValue === \"string\" && modeOption.currentValue.length > 0\n ? modeOption.currentValue\n : availableModes[0]?.id ?? \"\",\n availableModes,\n };\n}\n\nfunction applyCurrentMode(\n modes: SessionModeState | null | undefined,\n currentModeId: string,\n): SessionModeState | null {\n if (modes && Array.isArray(modes.availableModes)) {\n return {\n ...modes,\n currentModeId,\n };\n }\n return {\n currentModeId,\n availableModes: [],\n };\n}\n\nfunction applyConfigOptionValue(\n configOptions: SessionConfigOption[],\n configId: string,\n value: string,\n): SessionConfigOption[] | null {\n const idx = configOptions.findIndex((o) => o.id === configId);\n if (idx === -1) {\n return null;\n }\n const updated = cloneConfigOptions(configOptions) ?? [];\n updated[idx] = { ...updated[idx]!, currentValue: value };\n return updated;\n}\n\nfunction flattenConfigOptions(entry: unknown): Array<{ value: string; name: string; description?: string }> {\n if (!isRecord(entry)) {\n return [];\n }\n if (typeof entry.value === \"string\" && typeof entry.name === \"string\") {\n return [\n {\n value: entry.value,\n name: entry.name,\n description: typeof entry.description === \"string\" ? entry.description : undefined,\n },\n ];\n }\n if (!Array.isArray(entry.options)) {\n return [];\n }\n return entry.options.flatMap((nested) => flattenConfigOptions(nested));\n}\n\nfunction envelopeSessionUpdate(message: AnyMessage): Record<string, unknown> | null {\n if (!isRecord(message) || !(\"params\" in message) || !isRecord(message.params)) {\n return null;\n }\n if (!(\"update\" in message.params) || !isRecord(message.params.update)) {\n return null;\n }\n return message.params.update;\n}\n\nfunction cloneConfigOptions(value: SessionConfigOption[] | null | undefined): SessionConfigOption[] | undefined {\n if (!value) {\n return undefined;\n }\n return JSON.parse(JSON.stringify(value)) as SessionConfigOption[];\n}\n\nfunction cloneModes(value: SessionModeState | null | undefined): SessionModeState | null {\n if (!value) {\n return null;\n }\n return JSON.parse(JSON.stringify(value)) as SessionModeState;\n}\n\nfunction availablePermissionReplies(options: PermissionOption[]): PermissionReply[] {\n const replies = new Set<PermissionReply>();\n for (const option of options) {\n if (option.kind === \"allow_once\") {\n replies.add(\"once\");\n } else if (option.kind === \"allow_always\") {\n replies.add(\"always\");\n } else if (option.kind === \"reject_once\" || option.kind === \"reject_always\") {\n replies.add(\"reject\");\n }\n }\n return [...replies];\n}\n\nfunction permissionReplyToResponse(\n permissionId: string,\n request: RequestPermissionRequest,\n reply: PermissionReply,\n): RequestPermissionResponse {\n const preferredKinds: PermissionOptionKind[] =\n reply === \"once\"\n ? [\"allow_once\"]\n : reply === \"always\"\n ? [\"allow_always\", \"allow_once\"]\n : [\"reject_once\", \"reject_always\"];\n\n const selected = preferredKinds\n .map((kind) => request.options.find((option) => option.kind === kind))\n .find((option): option is PermissionOption => Boolean(option));\n\n if (!selected) {\n throw new UnsupportedPermissionReplyError(\n permissionId,\n reply,\n availablePermissionReplies(request.options),\n );\n }\n\n return {\n outcome: {\n outcome: \"selected\",\n optionId: selected.optionId,\n },\n };\n}\n\nfunction cancelledPermissionResponse(): RequestPermissionResponse {\n return {\n outcome: {\n outcome: \"cancelled\",\n },\n };\n}\n\nfunction isSessionConfigOption(value: unknown): value is SessionConfigOption {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.name === \"string\" &&\n typeof value.type === \"string\"\n );\n}\n\nfunction toTitleCase(input: string): string {\n if (!input) {\n return \"\";\n }\n return input\n .split(/[_\\s-]+/)\n .filter(Boolean)\n .map((part) => part[0]!.toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction formatHealthWaitError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n\n if (error === undefined || error === null) {\n return \"unknown error\";\n }\n\n return String(error);\n}\n\nfunction anyAbortSignal(signals: Array<AbortSignal | undefined>): AbortSignal | undefined {\n const active = signals.filter((signal): signal is AbortSignal => Boolean(signal));\n if (active.length === 0) {\n return undefined;\n }\n\n if (active.length === 1) {\n return active[0];\n }\n\n const controller = new AbortController();\n const onAbort = (event: Event) => {\n cleanup();\n const signal = event.target as AbortSignal;\n controller.abort(signal.reason ?? createAbortError());\n };\n const cleanup = () => {\n for (const signal of active) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n for (const signal of active) {\n if (signal.aborted) {\n controller.abort(signal.reason ?? createAbortError());\n return controller.signal;\n }\n }\n\n for (const signal of active) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return controller.signal;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) {\n return;\n }\n\n throw signal.reason instanceof Error ? signal.reason : createAbortError(signal.reason);\n}\n\nasync function waitForAbortable<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n if (!signal) {\n return promise;\n }\n\n throwIfAborted(signal);\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n reject(signal.reason instanceof Error ? signal.reason : createAbortError(signal.reason));\n };\n const cleanup = () => {\n signal.removeEventListener(\"abort\", onAbort);\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n });\n}\n\nasync function consumeProcessLogSse(\n body: ReadableStream<Uint8Array>,\n listener: ProcessLogListener,\n signal: AbortSignal,\n): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n\n let separatorIndex = buffer.indexOf(\"\\n\\n\");\n while (separatorIndex !== -1) {\n const chunk = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + 2);\n\n const entry = parseProcessLogSseChunk(chunk);\n if (entry) {\n listener(entry);\n }\n\n separatorIndex = buffer.indexOf(\"\\n\\n\");\n }\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) {\n return;\n }\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction parseProcessLogSseChunk(chunk: string): ProcessLogEntry | null {\n if (!chunk.trim()) {\n return null;\n }\n\n let eventName = \"message\";\n const dataLines: string[] = [];\n\n for (const line of chunk.split(\"\\n\")) {\n if (!line || line.startsWith(\":\")) {\n continue;\n }\n\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(6).trim();\n continue;\n }\n\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).trimStart());\n }\n }\n\n if (eventName !== \"log\") {\n return null;\n }\n\n const data = dataLines.join(\"\\n\");\n if (!data.trim()) {\n return null;\n }\n\n return JSON.parse(data) as ProcessLogEntry;\n}\n\nfunction toWebSocketUrl(url: string): string {\n const parsed = new URL(url);\n if (parsed.protocol === \"http:\") {\n parsed.protocol = \"ws:\";\n } else if (parsed.protocol === \"https:\") {\n parsed.protocol = \"wss:\";\n }\n return parsed.toString();\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction createAbortError(reason?: unknown): Error {\n if (reason instanceof Error) {\n return reason;\n }\n\n const message = typeof reason === \"string\" ? reason : \"This operation was aborted.\";\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(message, \"AbortError\");\n }\n\n const error = new Error(message);\n error.name = \"AbortError\";\n return error;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n throwIfAborted(signal);\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = () => {\n cleanup();\n reject(signal.reason instanceof Error ? signal.reason : createAbortError(signal.reason));\n };\n const cleanup = () => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import type {\n AnyMessage,\n NewSessionRequest,\n SessionConfigOption,\n SessionModeState,\n} from \"acp-http-client\";\nimport type { components, operations } from \"./generated/openapi.ts\";\n\nexport type ProblemDetails = components[\"schemas\"][\"ProblemDetails\"];\n\nexport type HealthResponse = JsonResponse<operations[\"get_v1_health\"], 200>;\nexport type AgentListResponse = JsonResponse<operations[\"get_v1_agents\"], 200>;\nexport type AgentInfo = components[\"schemas\"][\"AgentInfo\"];\nexport type AgentQuery = QueryParams<operations[\"get_v1_agents\"]>;\nexport type AgentInstallRequest = JsonRequestBody<operations[\"post_v1_agent_install\"]>;\nexport type AgentInstallResponse = JsonResponse<operations[\"post_v1_agent_install\"], 200>;\n\nexport type AcpEnvelope = components[\"schemas\"][\"AcpEnvelope\"];\nexport type AcpServerInfo = components[\"schemas\"][\"AcpServerInfo\"];\nexport type AcpServerListResponse = JsonResponse<operations[\"get_v1_acp_servers\"], 200>;\n\nexport type FsEntriesQuery = QueryParams<operations[\"get_v1_fs_entries\"]>;\nexport type FsEntry = components[\"schemas\"][\"FsEntry\"];\nexport type FsPathQuery = QueryParams<operations[\"get_v1_fs_file\"]>;\nexport type FsDeleteQuery = QueryParams<operations[\"delete_v1_fs_entry\"]>;\nexport type FsUploadBatchQuery = QueryParams<operations[\"post_v1_fs_upload_batch\"]>;\nexport type FsWriteResponse = JsonResponse<operations[\"put_v1_fs_file\"], 200>;\nexport type FsActionResponse = JsonResponse<operations[\"delete_v1_fs_entry\"], 200>;\nexport type FsMoveRequest = JsonRequestBody<operations[\"post_v1_fs_move\"]>;\nexport type FsMoveResponse = JsonResponse<operations[\"post_v1_fs_move\"], 200>;\nexport type FsStat = JsonResponse<operations[\"get_v1_fs_stat\"], 200>;\nexport type FsUploadBatchResponse = JsonResponse<operations[\"post_v1_fs_upload_batch\"], 200>;\n\nexport type McpConfigQuery = QueryParams<operations[\"get_v1_config_mcp\"]>;\nexport type McpServerConfig = components[\"schemas\"][\"McpServerConfig\"];\n\nexport type SkillsConfigQuery = QueryParams<operations[\"get_v1_config_skills\"]>;\nexport type SkillsConfig = components[\"schemas\"][\"SkillsConfig\"];\n\nexport type ProcessConfig = JsonResponse<operations[\"get_v1_processes_config\"], 200>;\nexport type ProcessCreateRequest = JsonRequestBody<operations[\"post_v1_processes\"]>;\nexport type ProcessInfo = components[\"schemas\"][\"ProcessInfo\"];\nexport type ProcessInputRequest = JsonRequestBody<operations[\"post_v1_process_input\"]>;\nexport type ProcessInputResponse = JsonResponse<operations[\"post_v1_process_input\"], 200>;\nexport type ProcessListResponse = JsonResponse<operations[\"get_v1_processes\"], 200>;\nexport type ProcessLogEntry = components[\"schemas\"][\"ProcessLogEntry\"];\nexport type ProcessLogsQuery = QueryParams<operations[\"get_v1_process_logs\"]>;\nexport type ProcessLogsResponse = JsonResponse<operations[\"get_v1_process_logs\"], 200>;\nexport type ProcessLogsStream = components[\"schemas\"][\"ProcessLogsStream\"];\nexport type ProcessRunRequest = JsonRequestBody<operations[\"post_v1_processes_run\"]>;\nexport type ProcessRunResponse = JsonResponse<operations[\"post_v1_processes_run\"], 200>;\nexport type ProcessSignalQuery = QueryParams<operations[\"post_v1_process_stop\"]>;\nexport type ProcessState = components[\"schemas\"][\"ProcessState\"];\nexport type ProcessTerminalResizeRequest = JsonRequestBody<operations[\"post_v1_process_terminal_resize\"]>;\nexport type ProcessTerminalResizeResponse = JsonResponse<operations[\"post_v1_process_terminal_resize\"], 200>;\n\nexport type ProcessTerminalClientFrame =\n | {\n type: \"input\";\n data: string;\n encoding?: string;\n }\n | {\n type: \"resize\";\n cols: number;\n rows: number;\n }\n | {\n type: \"close\";\n };\n\nexport interface ProcessTerminalReadyFrame {\n type: \"ready\";\n processId: string;\n}\n\nexport interface ProcessTerminalExitFrame {\n type: \"exit\";\n exitCode?: number | null;\n}\n\nexport interface ProcessTerminalErrorFrame {\n type: \"error\";\n message: string;\n}\n\nexport type ProcessTerminalServerFrame =\n | ProcessTerminalReadyFrame\n | ProcessTerminalExitFrame\n | ProcessTerminalErrorFrame;\n\nexport type TerminalReadyStatus = ProcessTerminalReadyFrame;\nexport type TerminalExitStatus = ProcessTerminalExitFrame;\nexport type TerminalErrorStatus = ProcessTerminalErrorFrame;\nexport type TerminalStatusMessage = ProcessTerminalServerFrame;\n\nexport interface TerminalResizePayload {\n cols: number;\n rows: number;\n}\n\nexport interface SessionRecord {\n id: string;\n agent: string;\n agentSessionId: string;\n lastConnectionId: string;\n createdAt: number;\n destroyedAt?: number;\n sessionInit?: Omit<NewSessionRequest, \"_meta\">;\n configOptions?: SessionConfigOption[];\n modes?: SessionModeState | null;\n}\n\nexport type SessionEventSender = \"client\" | \"agent\";\n\nexport interface SessionEvent {\n // Stable unique event id. For ordering, sort by (sessionId, eventIndex).\n id: string;\n eventIndex: number;\n sessionId: string;\n createdAt: number;\n connectionId: string;\n sender: SessionEventSender;\n payload: AnyMessage;\n}\n\nexport interface ListPageRequest {\n cursor?: string;\n limit?: number;\n}\n\nexport interface ListPage<T> {\n items: T[];\n nextCursor?: string;\n}\n\nexport interface ListEventsRequest extends ListPageRequest {\n sessionId: string;\n}\n\nexport interface SessionPersistDriver {\n getSession(id: string): Promise<SessionRecord | null>;\n listSessions(request?: ListPageRequest): Promise<ListPage<SessionRecord>>;\n updateSession(session: SessionRecord): Promise<void>;\n listEvents(request: ListEventsRequest): Promise<ListPage<SessionEvent>>;\n insertEvent(event: SessionEvent): Promise<void>;\n}\n\nexport interface InMemorySessionPersistDriverOptions {\n maxSessions?: number;\n maxEventsPerSession?: number;\n}\n\nconst DEFAULT_MAX_SESSIONS = 1024;\nconst DEFAULT_MAX_EVENTS_PER_SESSION = 500;\nconst DEFAULT_LIST_LIMIT = 100;\n\nexport class InMemorySessionPersistDriver implements SessionPersistDriver {\n private readonly maxSessions: number;\n private readonly maxEventsPerSession: number;\n private readonly sessions = new Map<string, SessionRecord>();\n private readonly eventsBySession = new Map<string, SessionEvent[]>();\n\n constructor(options: InMemorySessionPersistDriverOptions = {}) {\n this.maxSessions = normalizeCap(options.maxSessions, DEFAULT_MAX_SESSIONS);\n this.maxEventsPerSession = normalizeCap(\n options.maxEventsPerSession,\n DEFAULT_MAX_EVENTS_PER_SESSION,\n );\n }\n\n async getSession(id: string): Promise<SessionRecord | null> {\n const session = this.sessions.get(id);\n return session ? cloneSessionRecord(session) : null;\n }\n\n async listSessions(request: ListPageRequest = {}): Promise<ListPage<SessionRecord>> {\n const sorted = [...this.sessions.values()].sort((a, b) => {\n if (a.createdAt !== b.createdAt) {\n return a.createdAt - b.createdAt;\n }\n return a.id.localeCompare(b.id);\n });\n const page = paginate(sorted, request);\n return {\n items: page.items.map(cloneSessionRecord),\n nextCursor: page.nextCursor,\n };\n }\n\n async updateSession(session: SessionRecord): Promise<void> {\n this.sessions.set(session.id, { ...session });\n\n if (!this.eventsBySession.has(session.id)) {\n this.eventsBySession.set(session.id, []);\n }\n\n if (this.sessions.size <= this.maxSessions) {\n return;\n }\n\n const overflow = this.sessions.size - this.maxSessions;\n const removable = [...this.sessions.values()]\n .sort((a, b) => {\n if (a.createdAt !== b.createdAt) {\n return a.createdAt - b.createdAt;\n }\n return a.id.localeCompare(b.id);\n })\n .slice(0, overflow)\n .map((sessionToRemove) => sessionToRemove.id);\n\n for (const sessionId of removable) {\n this.sessions.delete(sessionId);\n this.eventsBySession.delete(sessionId);\n }\n }\n\n async listEvents(request: ListEventsRequest): Promise<ListPage<SessionEvent>> {\n const all = [...(this.eventsBySession.get(request.sessionId) ?? [])].sort((a, b) => {\n if (a.eventIndex !== b.eventIndex) {\n return a.eventIndex - b.eventIndex;\n }\n return a.id.localeCompare(b.id);\n });\n const page = paginate(all, request);\n return {\n items: page.items.map(cloneSessionEvent),\n nextCursor: page.nextCursor,\n };\n }\n\n async insertEvent(event: SessionEvent): Promise<void> {\n const events = this.eventsBySession.get(event.sessionId) ?? [];\n events.push(cloneSessionEvent(event));\n\n if (events.length > this.maxEventsPerSession) {\n events.splice(0, events.length - this.maxEventsPerSession);\n }\n\n this.eventsBySession.set(event.sessionId, events);\n }\n}\n\nfunction cloneSessionRecord(session: SessionRecord): SessionRecord {\n return {\n ...session,\n sessionInit: session.sessionInit\n ? (JSON.parse(JSON.stringify(session.sessionInit)) as SessionRecord[\"sessionInit\"])\n : undefined,\n configOptions: session.configOptions\n ? (JSON.parse(JSON.stringify(session.configOptions)) as SessionRecord[\"configOptions\"])\n : undefined,\n modes: session.modes\n ? (JSON.parse(JSON.stringify(session.modes)) as SessionRecord[\"modes\"])\n : session.modes,\n };\n}\n\nfunction cloneSessionEvent(event: SessionEvent): SessionEvent {\n return {\n ...event,\n payload: JSON.parse(JSON.stringify(event.payload)) as AnyMessage,\n };\n}\n\ntype ResponsesOf<T> = T extends { responses: infer R } ? R : never;\ntype JsonResponse<T, StatusCode extends keyof ResponsesOf<T>> = ResponsesOf<T>[StatusCode] extends {\n content: { \"application/json\": infer B };\n}\n ? B\n : never;\n\ntype JsonRequestBody<T> = T extends {\n requestBody: { content: { \"application/json\": infer B } };\n}\n ? B\n : never;\n\ntype QueryParams<T> = T extends { parameters: { query: infer Q } }\n ? Q\n : T extends { parameters: { query?: infer Q } }\n ? Q\n : never;\n\nfunction normalizeCap(value: number | undefined, fallback: number): number {\n if (!Number.isFinite(value) || (value ?? 0) < 1) {\n return fallback;\n }\n return Math.floor(value as number);\n}\n\nfunction paginate<T>(items: T[], request: ListPageRequest): ListPage<T> {\n const offset = parseCursor(request.cursor);\n const limit = normalizeCap(request.limit, DEFAULT_LIST_LIMIT);\n const slice = items.slice(offset, offset + limit);\n const nextOffset = offset + slice.length;\n return {\n items: slice,\n nextCursor: nextOffset < items.length ? String(nextOffset) : undefined,\n };\n}\n\nfunction parseCursor(cursor: string | undefined): number {\n if (!cursor) {\n return 0;\n }\n const parsed = Number.parseInt(cursor, 10);\n if (!Number.isFinite(parsed) || parsed < 0) {\n return 0;\n }\n return parsed;\n}\n","export {\n LiveAcpConnection,\n ProcessTerminalSession,\n SandboxAgent,\n SandboxAgentError,\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\";\n\nexport type {\n SandboxAgentHealthWaitOptions,\n AgentQueryOptions,\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 {\n InMemorySessionPersistDriver,\n} from \"./types.ts\";\n\nexport type {\n AcpEnvelope,\n AcpServerInfo,\n AcpServerListResponse,\n AgentInfo,\n AgentQuery,\n AgentInstallRequest,\n AgentInstallResponse,\n AgentListResponse,\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 ProcessListResponse,\n ProcessLogEntry,\n ProcessLogsQuery,\n ProcessLogsResponse,\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":"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","names":["pending","AcpRpcError"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/types.ts","../src/index.ts","../src/inspector.ts"],"sourcesContent":["import {\n AcpHttpClient,\n AcpRpcError,\n PROTOCOL_VERSION,\n type AcpEnvelopeDirection,\n type AnyMessage,\n type AuthMethod,\n type CancelNotification,\n type NewSessionRequest,\n type NewSessionResponse,\n type PermissionOption,\n type PermissionOptionKind,\n type PromptRequest,\n type PromptResponse,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type SessionConfigOption,\n type SessionNotification,\n type SessionModeState,\n type SetSessionConfigOptionResponse,\n type SetSessionConfigOptionRequest,\n type SetSessionModeResponse,\n type SetSessionModeRequest,\n} from \"acp-http-client\";\nimport type { SandboxAgentSpawnHandle, SandboxAgentSpawnOptions } from \"./spawn.ts\";\nimport {\n type AcpServerListResponse,\n type AgentInfo,\n type AgentInstallRequest,\n type AgentInstallResponse,\n type AgentListResponse,\n type FsActionResponse,\n type FsDeleteQuery,\n type FsEntriesQuery,\n type FsEntry,\n type FsMoveRequest,\n type FsMoveResponse,\n type FsPathQuery,\n type FsStat,\n type FsUploadBatchQuery,\n type FsUploadBatchResponse,\n type FsWriteResponse,\n type HealthResponse,\n InMemorySessionPersistDriver,\n type ListEventsRequest,\n type ListPage,\n type ListPageRequest,\n type McpConfigQuery,\n type McpServerConfig,\n type ProblemDetails,\n type ProcessConfig,\n type ProcessCreateRequest,\n type ProcessInfo,\n type ProcessInputRequest,\n type ProcessInputResponse,\n type ProcessListResponse,\n type ProcessLogEntry,\n type ProcessLogsQuery,\n type ProcessLogsResponse,\n type ProcessRunRequest,\n type ProcessRunResponse,\n type ProcessSignalQuery,\n type ProcessTerminalClientFrame,\n type ProcessTerminalServerFrame,\n type ProcessTerminalResizeRequest,\n type ProcessTerminalResizeResponse,\n type SessionEvent,\n type SessionPersistDriver,\n type SessionRecord,\n type SkillsConfig,\n type SkillsConfigQuery,\n type TerminalErrorStatus,\n type TerminalExitStatus,\n type TerminalReadyStatus,\n type TerminalResizePayload,\n} from \"./types.ts\";\n\nconst API_PREFIX = \"/v1\";\nconst FS_PATH = `${API_PREFIX}/fs`;\nconst DEFAULT_BASE_URL = \"http://sandbox-agent\";\n\nconst DEFAULT_REPLAY_MAX_EVENTS = 50;\nconst DEFAULT_REPLAY_MAX_CHARS = 12_000;\nconst EVENT_INDEX_SCAN_EVENTS_LIMIT = 500;\nconst SESSION_CANCEL_METHOD = \"session/cancel\";\nconst MANUAL_CANCEL_ERROR = \"Manual session/cancel calls are not allowed. Use destroySession(sessionId) instead.\";\nconst HEALTH_WAIT_MIN_DELAY_MS = 500;\nconst HEALTH_WAIT_MAX_DELAY_MS = 15_000;\nconst HEALTH_WAIT_LOG_AFTER_MS = 5_000;\nconst HEALTH_WAIT_LOG_EVERY_MS = 10_000;\n\nexport interface SandboxAgentHealthWaitOptions {\n timeoutMs?: number;\n}\n\ninterface SandboxAgentConnectCommonOptions {\n headers?: HeadersInit;\n persist?: SessionPersistDriver;\n replayMaxEvents?: number;\n replayMaxChars?: number;\n signal?: AbortSignal;\n token?: string;\n waitForHealth?: boolean | SandboxAgentHealthWaitOptions;\n}\n\nexport type SandboxAgentConnectOptions =\n | (SandboxAgentConnectCommonOptions & {\n baseUrl: string;\n fetch?: typeof fetch;\n })\n | (SandboxAgentConnectCommonOptions & {\n fetch: typeof fetch;\n baseUrl?: string;\n });\n\nexport interface SandboxAgentStartOptions {\n fetch?: typeof fetch;\n headers?: HeadersInit;\n persist?: SessionPersistDriver;\n replayMaxEvents?: number;\n replayMaxChars?: number;\n spawn?: SandboxAgentSpawnOptions | boolean;\n}\n\nexport interface SessionCreateRequest {\n id?: string;\n agent: string;\n sessionInit?: Omit<NewSessionRequest, \"_meta\">;\n model?: string;\n mode?: string;\n thoughtLevel?: string;\n}\n\nexport interface SessionResumeOrCreateRequest {\n id: string;\n agent: string;\n sessionInit?: Omit<NewSessionRequest, \"_meta\">;\n model?: string;\n mode?: string;\n thoughtLevel?: string;\n}\n\nexport interface SessionSendOptions {\n notification?: boolean;\n}\n\nexport type SessionEventListener = (event: SessionEvent) => void;\nexport type PermissionReply = \"once\" | \"always\" | \"reject\";\nexport type PermissionRequestListener = (request: SessionPermissionRequest) => void;\nexport type ProcessLogListener = (entry: ProcessLogEntry) => void;\nexport type ProcessLogFollowQuery = Omit<ProcessLogsQuery, \"follow\">;\n\nexport interface SessionPermissionRequestOption {\n optionId: string;\n name: string;\n kind: PermissionOptionKind;\n}\n\nexport interface SessionPermissionRequest {\n id: string;\n createdAt: number;\n sessionId: string;\n agentSessionId: string;\n availableReplies: PermissionReply[];\n options: SessionPermissionRequestOption[];\n toolCall: RequestPermissionRequest[\"toolCall\"];\n rawRequest: RequestPermissionRequest;\n}\n\nexport interface AgentQueryOptions {\n config?: boolean;\n noCache?: boolean;\n}\n\nexport interface ProcessLogSubscription {\n close(): void;\n closed: Promise<void>;\n}\n\nexport interface ProcessTerminalWebSocketUrlOptions {\n accessToken?: string;\n}\n\nexport interface ProcessTerminalConnectOptions extends ProcessTerminalWebSocketUrlOptions {\n protocols?: string | string[];\n WebSocket?: typeof WebSocket;\n}\n\nexport type ProcessTerminalSessionOptions = ProcessTerminalConnectOptions;\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\nexport class UnsupportedSessionCategoryError extends Error {\n readonly sessionId: string;\n readonly category: string;\n readonly availableCategories: string[];\n\n constructor(sessionId: string, category: string, availableCategories: string[]) {\n super(`Session '${sessionId}' does not support category '${category}'. Available categories: ${availableCategories.join(\", \") || \"(none)\"}`);\n this.name = \"UnsupportedSessionCategoryError\";\n this.sessionId = sessionId;\n this.category = category;\n this.availableCategories = availableCategories;\n }\n}\n\nexport class UnsupportedSessionValueError extends Error {\n readonly sessionId: string;\n readonly category: string;\n readonly configId: string;\n readonly requestedValue: string;\n readonly allowedValues: string[];\n\n constructor(sessionId: string, category: string, configId: string, requestedValue: string, allowedValues: string[]) {\n super(\n `Session '${sessionId}' does not support value '${requestedValue}' for category '${category}' (configId='${configId}'). Allowed values: ${allowedValues.join(\", \") || \"(none)\"}`,\n );\n this.name = \"UnsupportedSessionValueError\";\n this.sessionId = sessionId;\n this.category = category;\n this.configId = configId;\n this.requestedValue = requestedValue;\n this.allowedValues = allowedValues;\n }\n}\n\nexport class UnsupportedSessionConfigOptionError extends Error {\n readonly sessionId: string;\n readonly configId: string;\n readonly availableConfigIds: string[];\n\n constructor(sessionId: string, configId: string, availableConfigIds: string[]) {\n super(`Session '${sessionId}' does not expose config option '${configId}'. Available configIds: ${availableConfigIds.join(\", \") || \"(none)\"}`);\n this.name = \"UnsupportedSessionConfigOptionError\";\n this.sessionId = sessionId;\n this.configId = configId;\n this.availableConfigIds = availableConfigIds;\n }\n}\n\nexport class UnsupportedPermissionReplyError extends Error {\n readonly permissionId: string;\n readonly requestedReply: PermissionReply;\n readonly availableReplies: PermissionReply[];\n\n constructor(permissionId: string, requestedReply: PermissionReply, availableReplies: PermissionReply[]) {\n super(`Permission '${permissionId}' does not support reply '${requestedReply}'. Available replies: ${availableReplies.join(\", \") || \"(none)\"}`);\n this.name = \"UnsupportedPermissionReplyError\";\n this.permissionId = permissionId;\n this.requestedReply = requestedReply;\n this.availableReplies = availableReplies;\n }\n}\n\nexport class Session {\n private record: SessionRecord;\n private readonly sandbox: SandboxAgent;\n\n constructor(sandbox: SandboxAgent, record: SessionRecord) {\n this.sandbox = sandbox;\n this.record = { ...record };\n }\n\n get id(): string {\n return this.record.id;\n }\n\n get agent(): string {\n return this.record.agent;\n }\n\n get agentSessionId(): string {\n return this.record.agentSessionId;\n }\n\n get lastConnectionId(): string {\n return this.record.lastConnectionId;\n }\n\n get createdAt(): number {\n return this.record.createdAt;\n }\n\n get destroyedAt(): number | undefined {\n return this.record.destroyedAt;\n }\n\n async refresh(): Promise<Session> {\n const latest = await this.sandbox.getSession(this.id);\n if (!latest) {\n throw new Error(`session '${this.id}' no longer exists`);\n }\n this.apply(latest.toRecord());\n return this;\n }\n\n async rawSend(method: string, params: Record<string, unknown> = {}, options: SessionSendOptions = {}): Promise<unknown> {\n const updated = await this.sandbox.rawSendSessionMethod(this.id, method, params, options);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async prompt(prompt: PromptRequest[\"prompt\"]): Promise<PromptResponse> {\n const response = await this.rawSend(\"session/prompt\", { prompt });\n return response as PromptResponse;\n }\n\n async setMode(modeId: string): Promise<SetSessionModeResponse | void> {\n const updated = await this.sandbox.setSessionMode(this.id, modeId);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async setConfigOption(configId: string, value: string): Promise<SetSessionConfigOptionResponse> {\n const updated = await this.sandbox.setSessionConfigOption(this.id, configId, value);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async setModel(model: string): Promise<SetSessionConfigOptionResponse> {\n const updated = await this.sandbox.setSessionModel(this.id, model);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async setThoughtLevel(thoughtLevel: string): Promise<SetSessionConfigOptionResponse> {\n const updated = await this.sandbox.setSessionThoughtLevel(this.id, thoughtLevel);\n this.apply(updated.session.toRecord());\n return updated.response;\n }\n\n async getConfigOptions(): Promise<SessionConfigOption[]> {\n return this.sandbox.getSessionConfigOptions(this.id);\n }\n\n async getModes(): Promise<SessionModeState | null> {\n return this.sandbox.getSessionModes(this.id);\n }\n\n onEvent(listener: SessionEventListener): () => void {\n return this.sandbox.onSessionEvent(this.id, listener);\n }\n\n onPermissionRequest(listener: PermissionRequestListener): () => void {\n return this.sandbox.onPermissionRequest(this.id, listener);\n }\n\n async respondPermission(permissionId: string, reply: PermissionReply): Promise<void> {\n await this.sandbox.respondPermission(permissionId, reply);\n }\n\n async rawRespondPermission(permissionId: string, response: RequestPermissionResponse): Promise<void> {\n await this.sandbox.rawRespondPermission(permissionId, response);\n }\n\n toRecord(): SessionRecord {\n return { ...this.record };\n }\n\n apply(record: SessionRecord): void {\n this.record = { ...record };\n }\n}\n\nexport class LiveAcpConnection {\n readonly connectionId: string;\n readonly agent: string;\n\n private readonly acp: AcpHttpClient;\n private readonly sessionByLocalId = new Map<string, string>();\n private readonly localByAgentSessionId = new Map<string, string>();\n private readonly pendingNewSessionLocals: string[] = [];\n private readonly pendingRequestSessionById = new Map<string, string>();\n private readonly pendingReplayByLocalSessionId = new Map<string, string>();\n private lastAdapterExit: { success: boolean; code: number | null } | null = null;\n private lastAdapterExitAt = 0;\n\n private readonly onObservedEnvelope: (\n connection: LiveAcpConnection,\n envelope: AnyMessage,\n direction: AcpEnvelopeDirection,\n localSessionId: string | null,\n ) => void;\n private readonly onPermissionRequest: (\n connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ) => Promise<RequestPermissionResponse>;\n\n private constructor(\n agent: string,\n connectionId: string,\n acp: AcpHttpClient,\n onObservedEnvelope: (connection: LiveAcpConnection, envelope: AnyMessage, direction: AcpEnvelopeDirection, localSessionId: string | null) => void,\n onPermissionRequest: (\n connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ) => Promise<RequestPermissionResponse>,\n ) {\n this.agent = agent;\n this.connectionId = connectionId;\n this.acp = acp;\n this.onObservedEnvelope = onObservedEnvelope;\n this.onPermissionRequest = onPermissionRequest;\n }\n\n static async create(options: {\n baseUrl: string;\n token?: string;\n fetcher: typeof fetch;\n headers?: HeadersInit;\n agent: string;\n serverId: string;\n onObservedEnvelope: (connection: LiveAcpConnection, envelope: AnyMessage, direction: AcpEnvelopeDirection, localSessionId: string | null) => void;\n onPermissionRequest: (\n connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ) => Promise<RequestPermissionResponse>;\n }): Promise<LiveAcpConnection> {\n const connectionId = randomId();\n\n let live: LiveAcpConnection | null = null;\n const acp = new AcpHttpClient({\n baseUrl: options.baseUrl,\n token: options.token,\n fetch: options.fetcher,\n headers: options.headers,\n transport: {\n path: `${API_PREFIX}/acp/${encodeURIComponent(options.serverId)}`,\n bootstrapQuery: { agent: options.agent },\n },\n client: {\n requestPermission: async (request: RequestPermissionRequest) => {\n if (!live) {\n return cancelledPermissionResponse();\n }\n return live.handlePermissionRequest(request);\n },\n sessionUpdate: async (_notification: SessionNotification) => {\n // Session updates are observed via envelope persistence.\n },\n extNotification: async (method: string, params: Record<string, unknown>) => {\n if (!live) return;\n live.handleAdapterNotification(method, params);\n },\n },\n onEnvelope: (envelope, direction) => {\n if (!live) {\n return;\n }\n live.handleEnvelope(envelope, direction);\n },\n });\n\n live = new LiveAcpConnection(options.agent, connectionId, acp, options.onObservedEnvelope, options.onPermissionRequest);\n\n const initResult = await acp.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientInfo: {\n name: \"sandbox-agent-sdk\",\n version: \"v1\",\n },\n });\n if (initResult.authMethods && initResult.authMethods.length > 0) {\n await autoAuthenticate(acp, initResult.authMethods);\n }\n return live;\n }\n\n async close(): Promise<void> {\n await this.acp.disconnect();\n }\n\n hasBoundSession(localSessionId: string, agentSessionId?: string): boolean {\n const bound = this.sessionByLocalId.get(localSessionId);\n if (!bound) {\n return false;\n }\n if (agentSessionId && bound !== agentSessionId) {\n return false;\n }\n return true;\n }\n\n bindSession(localSessionId: string, agentSessionId: string): void {\n this.sessionByLocalId.set(localSessionId, agentSessionId);\n this.localByAgentSessionId.set(agentSessionId, localSessionId);\n }\n\n queueReplay(localSessionId: string, replayText: string | null): void {\n if (!replayText) {\n this.pendingReplayByLocalSessionId.delete(localSessionId);\n return;\n }\n this.pendingReplayByLocalSessionId.set(localSessionId, replayText);\n }\n\n async createRemoteSession(localSessionId: string, sessionInit: Omit<NewSessionRequest, \"_meta\">): Promise<NewSessionResponse> {\n const createStartedAt = Date.now();\n this.pendingNewSessionLocals.push(localSessionId);\n\n try {\n const response = await this.acp.newSession(sessionInit);\n this.bindSession(localSessionId, response.sessionId);\n return response;\n } catch (error) {\n const index = this.pendingNewSessionLocals.indexOf(localSessionId);\n if (index !== -1) {\n this.pendingNewSessionLocals.splice(index, 1);\n }\n const adapterExit = this.lastAdapterExit;\n if (adapterExit && this.lastAdapterExitAt >= createStartedAt) {\n const suffix = adapterExit.code == null ? \"\" : ` (code ${adapterExit.code})`;\n throw new Error(`Agent process exited while creating session${suffix}`);\n }\n throw error;\n }\n }\n\n async sendSessionMethod(localSessionId: string, method: string, params: Record<string, unknown>, options: SessionSendOptions): Promise<unknown> {\n const agentSessionId = this.sessionByLocalId.get(localSessionId);\n if (!agentSessionId) {\n throw new Error(`session '${localSessionId}' is not bound to live ACP connection '${this.connectionId}'`);\n }\n\n const mappedParams = mapSessionParams(params, agentSessionId);\n\n if (method === \"session/prompt\") {\n const replayText = this.pendingReplayByLocalSessionId.get(localSessionId);\n if (replayText) {\n // TODO: Replace this synthesized replay text with ACP-native restore once standardized.\n this.pendingReplayByLocalSessionId.delete(localSessionId);\n injectReplayPrompt(mappedParams, replayText);\n }\n\n if (options.notification) {\n await this.acp.extNotification(method, mappedParams);\n return undefined;\n }\n\n return this.acp.prompt(mappedParams as PromptRequest);\n }\n\n if (method === \"session/cancel\") {\n await this.acp.cancel(mappedParams as CancelNotification);\n return undefined;\n }\n\n if (method === \"session/set_mode\") {\n return this.acp.setSessionMode(mappedParams as SetSessionModeRequest);\n }\n\n if (method === \"session/set_config_option\") {\n return this.acp.setSessionConfigOption(mappedParams as SetSessionConfigOptionRequest);\n }\n\n if (options.notification) {\n await this.acp.extNotification(method, mappedParams);\n return undefined;\n }\n\n return this.acp.extMethod(method, mappedParams);\n }\n\n private handleEnvelope(envelope: AnyMessage, direction: AcpEnvelopeDirection): void {\n const localSessionId = this.resolveSessionId(envelope, direction);\n this.onObservedEnvelope(this, envelope, direction, localSessionId);\n }\n\n private handleAdapterNotification(method: string, params: Record<string, unknown>): void {\n if (method !== \"_adapter/agent_exited\") {\n return;\n }\n this.lastAdapterExit = {\n success: params.success === true,\n code: typeof params.code === \"number\" ? params.code : null,\n };\n this.lastAdapterExitAt = Date.now();\n }\n\n private async handlePermissionRequest(request: RequestPermissionRequest): Promise<RequestPermissionResponse> {\n const agentSessionId = request.sessionId;\n const localSessionId = this.localByAgentSessionId.get(agentSessionId);\n if (!localSessionId) {\n return cancelledPermissionResponse();\n }\n\n return this.onPermissionRequest(this, localSessionId, agentSessionId, clonePermissionRequest(request));\n }\n\n private resolveSessionId(envelope: AnyMessage, direction: AcpEnvelopeDirection): string | null {\n const id = envelopeId(envelope);\n const method = envelopeMethod(envelope);\n\n if (direction === \"outbound\") {\n if (id && method === \"session/new\") {\n const localSessionId = this.pendingNewSessionLocals.shift() ?? null;\n if (localSessionId) {\n this.pendingRequestSessionById.set(id, localSessionId);\n }\n return localSessionId;\n }\n\n const localFromParams = this.localFromEnvelopeParams(envelope);\n if (id && localFromParams) {\n this.pendingRequestSessionById.set(id, localFromParams);\n }\n return localFromParams;\n }\n\n if (id) {\n const pending = this.pendingRequestSessionById.get(id) ?? null;\n if (pending) {\n this.pendingRequestSessionById.delete(id);\n const sessionIdFromResult = envelopeSessionIdFromResult(envelope);\n if (sessionIdFromResult) {\n this.bindSession(pending, sessionIdFromResult);\n }\n return pending;\n }\n }\n\n return this.localFromEnvelopeParams(envelope);\n }\n\n private localFromEnvelopeParams(envelope: AnyMessage): string | null {\n const agentSessionId = envelopeSessionIdFromParams(envelope);\n if (!agentSessionId) {\n return null;\n }\n return this.localByAgentSessionId.get(agentSessionId) ?? null;\n }\n}\n\nexport class ProcessTerminalSession {\n readonly socket: WebSocket;\n readonly closed: Promise<void>;\n\n private readonly readyListeners = new Set<(status: TerminalReadyStatus) => void>();\n private readonly dataListeners = new Set<(data: Uint8Array) => void>();\n private readonly exitListeners = new Set<(status: TerminalExitStatus) => void>();\n private readonly errorListeners = new Set<(error: TerminalErrorStatus | Error) => void>();\n private readonly closeListeners = new Set<() => void>();\n\n private closeSignalSent = false;\n private closedResolve!: () => void;\n\n constructor(socket: WebSocket) {\n this.socket = socket;\n this.socket.binaryType = \"arraybuffer\";\n this.closed = new Promise<void>((resolve) => {\n this.closedResolve = resolve;\n });\n\n this.socket.addEventListener(\"message\", (event) => {\n void this.handleMessage(event.data);\n });\n this.socket.addEventListener(\"error\", () => {\n this.emitError(new Error(\"Terminal websocket connection failed.\"));\n });\n this.socket.addEventListener(\"close\", () => {\n this.closedResolve();\n for (const listener of this.closeListeners) {\n listener();\n }\n });\n }\n\n onReady(listener: (status: TerminalReadyStatus) => void): () => void {\n this.readyListeners.add(listener);\n return () => {\n this.readyListeners.delete(listener);\n };\n }\n\n onData(listener: (data: Uint8Array) => void): () => void {\n this.dataListeners.add(listener);\n return () => {\n this.dataListeners.delete(listener);\n };\n }\n\n onExit(listener: (status: TerminalExitStatus) => void): () => void {\n this.exitListeners.add(listener);\n return () => {\n this.exitListeners.delete(listener);\n };\n }\n\n onError(listener: (error: TerminalErrorStatus | Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => {\n this.errorListeners.delete(listener);\n };\n }\n\n onClose(listener: () => void): () => void {\n this.closeListeners.add(listener);\n return () => {\n this.closeListeners.delete(listener);\n };\n }\n\n sendInput(data: string | ArrayBuffer | ArrayBufferView): void {\n const payload = encodeTerminalInput(data);\n this.sendFrame({\n type: \"input\",\n data: payload.data,\n encoding: payload.encoding,\n });\n }\n\n resize(payload: TerminalResizePayload): void {\n this.sendFrame({\n type: \"resize\",\n cols: payload.cols,\n rows: payload.rows,\n });\n }\n\n close(): void {\n if (this.socket.readyState === WS_READY_STATE_CONNECTING) {\n this.socket.addEventListener(\n \"open\",\n () => {\n this.close();\n },\n { once: true },\n );\n return;\n }\n\n if (this.socket.readyState === WS_READY_STATE_OPEN) {\n if (!this.closeSignalSent) {\n this.closeSignalSent = true;\n this.sendFrame({ type: \"close\" });\n }\n this.socket.close();\n return;\n }\n\n if (this.socket.readyState !== WS_READY_STATE_CLOSED) {\n this.socket.close();\n }\n }\n\n private async handleMessage(data: unknown): Promise<void> {\n try {\n if (typeof data === \"string\") {\n const frame = parseProcessTerminalServerFrame(data);\n if (!frame) {\n this.emitError(new Error(\"Received invalid terminal control frame.\"));\n return;\n }\n\n if (frame.type === \"ready\") {\n for (const listener of this.readyListeners) {\n listener(frame);\n }\n return;\n }\n\n if (frame.type === \"exit\") {\n for (const listener of this.exitListeners) {\n listener(frame);\n }\n return;\n }\n\n this.emitError(frame);\n return;\n }\n\n const bytes = await decodeTerminalBytes(data);\n for (const listener of this.dataListeners) {\n listener(bytes);\n }\n } catch (error) {\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n private sendFrame(frame: ProcessTerminalClientFrame): void {\n if (this.socket.readyState !== WS_READY_STATE_OPEN) {\n return;\n }\n\n this.socket.send(JSON.stringify(frame));\n }\n\n private emitError(error: TerminalErrorStatus | Error): void {\n for (const listener of this.errorListeners) {\n listener(error);\n }\n }\n}\n\nconst WS_READY_STATE_CONNECTING = 0;\nconst WS_READY_STATE_OPEN = 1;\nconst WS_READY_STATE_CLOSED = 3;\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 readonly healthWait: NormalizedHealthWaitOptions;\n private readonly healthWaitAbortController = new AbortController();\n\n private readonly persist: SessionPersistDriver;\n private readonly replayMaxEvents: number;\n private readonly replayMaxChars: number;\n\n private spawnHandle?: SandboxAgentSpawnHandle;\n private healthPromise?: Promise<void>;\n private healthError?: Error;\n private disposed = false;\n\n private readonly liveConnections = new Map<string, LiveAcpConnection>();\n private readonly pendingLiveConnections = new Map<string, Promise<LiveAcpConnection>>();\n private readonly sessionHandles = new Map<string, Session>();\n private readonly eventListeners = new Map<string, Set<SessionEventListener>>();\n private readonly permissionListeners = new Map<string, Set<PermissionRequestListener>>();\n private readonly pendingPermissionRequests = new Map<string, PendingPermissionRequestState>();\n private readonly nextSessionEventIndexBySession = new Map<string, number>();\n private readonly seedSessionEventIndexBySession = new Map<string, Promise<void>>();\n\n constructor(options: SandboxAgentConnectOptions) {\n const baseUrl = options.baseUrl?.trim();\n if (!baseUrl && !options.fetch) {\n throw new Error(\"baseUrl is required unless fetch is provided.\");\n }\n this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.token = options.token;\n const resolvedFetch = options.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!resolvedFetch) {\n throw new Error(\"Fetch API is not available; provide a fetch implementation.\");\n }\n this.fetcher = resolvedFetch;\n this.defaultHeaders = options.headers;\n this.healthWait = normalizeHealthWaitOptions(options.waitForHealth, options.signal);\n this.persist = options.persist ?? new InMemorySessionPersistDriver();\n\n this.replayMaxEvents = normalizePositiveInt(options.replayMaxEvents, DEFAULT_REPLAY_MAX_EVENTS);\n this.replayMaxChars = normalizePositiveInt(options.replayMaxChars, DEFAULT_REPLAY_MAX_CHARS);\n\n this.startHealthWait();\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\n const { spawnSandboxAgent } = await import(\"./spawn.js\");\n const resolvedFetch = options.fetch ?? globalThis.fetch?.bind(globalThis);\n const handle = await spawnSandboxAgent(spawnOptions, resolvedFetch);\n\n const client = new SandboxAgent({\n baseUrl: handle.baseUrl,\n token: handle.token,\n fetch: options.fetch,\n headers: options.headers,\n waitForHealth: false,\n persist: options.persist,\n replayMaxEvents: options.replayMaxEvents,\n replayMaxChars: options.replayMaxChars,\n });\n\n client.spawnHandle = handle;\n return client;\n }\n\n async dispose(): Promise<void> {\n this.disposed = true;\n this.healthWaitAbortController.abort(createAbortError(\"SandboxAgent was disposed.\"));\n\n for (const [permissionId, pending] of this.pendingPermissionRequests) {\n this.pendingPermissionRequests.delete(permissionId);\n pending.resolve(cancelledPermissionResponse());\n }\n\n const connections = [...this.liveConnections.values()];\n this.liveConnections.clear();\n const pending = [...this.pendingLiveConnections.values()];\n this.pendingLiveConnections.clear();\n\n const pendingSettled = await Promise.allSettled(pending);\n for (const item of pendingSettled) {\n if (item.status === \"fulfilled\") {\n connections.push(item.value);\n }\n }\n\n await Promise.all(\n connections.map(async (connection) => {\n await connection.close();\n }),\n );\n\n if (this.spawnHandle) {\n await this.spawnHandle.dispose();\n this.spawnHandle = undefined;\n }\n }\n\n async listSessions(request: ListPageRequest = {}): Promise<ListPage<Session>> {\n const page = await this.persist.listSessions(request);\n return {\n items: page.items.map((record) => this.upsertSessionHandle(record)),\n nextCursor: page.nextCursor,\n };\n }\n\n async getSession(id: string): Promise<Session | null> {\n const record = await this.persist.getSession(id);\n if (!record) {\n return null;\n }\n return this.upsertSessionHandle(record);\n }\n\n async getEvents(request: ListEventsRequest): Promise<ListPage<SessionEvent>> {\n return this.persist.listEvents(request);\n }\n\n async createSession(request: SessionCreateRequest): Promise<Session> {\n if (!request.agent.trim()) {\n throw new Error(\"createSession requires a non-empty agent\");\n }\n\n const localSessionId = request.id?.trim() || randomId();\n const live = await this.getLiveConnection(request.agent.trim());\n const sessionInit = normalizeSessionInit(request.sessionInit);\n\n const response = await live.createRemoteSession(localSessionId, sessionInit);\n\n const record: SessionRecord = {\n id: localSessionId,\n agent: request.agent.trim(),\n agentSessionId: response.sessionId,\n lastConnectionId: live.connectionId,\n createdAt: nowMs(),\n sessionInit,\n configOptions: cloneConfigOptions(response.configOptions),\n modes: cloneModes(response.modes),\n };\n\n await this.persist.updateSession(record);\n this.nextSessionEventIndexBySession.set(record.id, 1);\n live.bindSession(record.id, record.agentSessionId);\n let session = this.upsertSessionHandle(record);\n\n try {\n if (request.mode) {\n session = (await this.setSessionMode(session.id, request.mode)).session;\n }\n if (request.model) {\n session = (await this.setSessionModel(session.id, request.model)).session;\n }\n if (request.thoughtLevel) {\n session = (await this.setSessionThoughtLevel(session.id, request.thoughtLevel)).session;\n }\n } catch (err) {\n try {\n await this.destroySession(session.id);\n } catch {\n // Best-effort cleanup\n }\n throw err;\n }\n\n return session;\n }\n\n async resumeSession(id: string): Promise<Session> {\n const existing = await this.persist.getSession(id);\n if (!existing) {\n throw new Error(`session '${id}' not found`);\n }\n\n const live = await this.getLiveConnection(existing.agent);\n if (existing.lastConnectionId === live.connectionId && live.hasBoundSession(id, existing.agentSessionId)) {\n return this.upsertSessionHandle(existing);\n }\n\n const replaySource = await this.collectReplayEvents(existing.id, this.replayMaxEvents);\n const replayText = buildReplayText(replaySource, this.replayMaxChars);\n\n const recreated = await live.createRemoteSession(existing.id, normalizeSessionInit(existing.sessionInit));\n\n const updated: SessionRecord = {\n ...existing,\n agentSessionId: recreated.sessionId,\n lastConnectionId: live.connectionId,\n destroyedAt: undefined,\n configOptions: cloneConfigOptions(recreated.configOptions),\n modes: cloneModes(recreated.modes),\n };\n\n await this.persist.updateSession(updated);\n live.bindSession(updated.id, updated.agentSessionId);\n live.queueReplay(updated.id, replayText);\n\n return this.upsertSessionHandle(updated);\n }\n\n async resumeOrCreateSession(request: SessionResumeOrCreateRequest): Promise<Session> {\n const existing = await this.persist.getSession(request.id);\n if (existing) {\n let session = await this.resumeSession(existing.id);\n if (request.mode) {\n session = (await this.setSessionMode(session.id, request.mode)).session;\n }\n if (request.model) {\n session = (await this.setSessionModel(session.id, request.model)).session;\n }\n if (request.thoughtLevel) {\n session = (await this.setSessionThoughtLevel(session.id, request.thoughtLevel)).session;\n }\n return session;\n }\n return this.createSession(request);\n }\n\n async destroySession(id: string): Promise<Session> {\n this.cancelPendingPermissionsForSession(id);\n\n try {\n await this.sendSessionMethodInternal(id, SESSION_CANCEL_METHOD, {}, {}, true);\n } catch {\n // Best-effort: agent may already be gone\n }\n const existing = await this.requireSessionRecord(id);\n\n const updated: SessionRecord = {\n ...existing,\n destroyedAt: nowMs(),\n };\n\n await this.persist.updateSession(updated);\n return this.upsertSessionHandle(updated);\n }\n\n async setSessionMode(sessionId: string, modeId: string): Promise<{ session: Session; response: SetSessionModeResponse | void }> {\n const mode = modeId.trim();\n if (!mode) {\n throw new Error(\"setSessionMode requires a non-empty modeId\");\n }\n\n const record = await this.requireSessionRecord(sessionId);\n const knownModeIds = extractKnownModeIds(record.modes);\n if (knownModeIds.length > 0 && !knownModeIds.includes(mode)) {\n throw new UnsupportedSessionValueError(sessionId, \"mode\", \"mode\", mode, knownModeIds);\n }\n\n try {\n return (await this.sendSessionMethodInternal(sessionId, \"session/set_mode\", { modeId: mode }, {}, false)) as {\n session: Session;\n response: SetSessionModeResponse | void;\n };\n } catch (error) {\n if (!(error instanceof AcpRpcError) || error.code !== -32601) {\n throw error;\n }\n return this.setSessionCategoryValue(sessionId, \"mode\", mode);\n }\n }\n\n async setSessionConfigOption(sessionId: string, configId: string, value: string): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n const resolvedConfigId = configId.trim();\n if (!resolvedConfigId) {\n throw new Error(\"setSessionConfigOption requires a non-empty configId\");\n }\n const resolvedValue = value.trim();\n if (!resolvedValue) {\n throw new Error(\"setSessionConfigOption requires a non-empty value\");\n }\n\n const options = await this.getSessionConfigOptions(sessionId);\n const option = findConfigOptionById(options, resolvedConfigId);\n if (!option) {\n throw new UnsupportedSessionConfigOptionError(\n sessionId,\n resolvedConfigId,\n options.map((item) => item.id),\n );\n }\n\n const allowedValues = extractConfigValues(option);\n if (allowedValues.length > 0 && !allowedValues.includes(resolvedValue)) {\n throw new UnsupportedSessionValueError(sessionId, option.category ?? \"uncategorized\", option.id, resolvedValue, allowedValues);\n }\n\n return (await this.sendSessionMethodInternal(\n sessionId,\n \"session/set_config_option\",\n {\n configId: resolvedConfigId,\n value: resolvedValue,\n },\n {},\n false,\n )) as { session: Session; response: SetSessionConfigOptionResponse };\n }\n\n async setSessionModel(sessionId: string, model: string): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n return this.setSessionCategoryValue(sessionId, \"model\", model);\n }\n\n async setSessionThoughtLevel(sessionId: string, thoughtLevel: string): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n return this.setSessionCategoryValue(sessionId, \"thought_level\", thoughtLevel);\n }\n\n async getSessionConfigOptions(sessionId: string): Promise<SessionConfigOption[]> {\n const record = await this.requireSessionRecord(sessionId);\n const hydrated = await this.hydrateSessionConfigOptions(record.id, record);\n return cloneConfigOptions(hydrated.configOptions) ?? [];\n }\n\n async getSessionModes(sessionId: string): Promise<SessionModeState | null> {\n const record = await this.requireSessionRecord(sessionId);\n if (record.modes && record.modes.availableModes.length > 0) {\n return cloneModes(record.modes);\n }\n\n const hydrated = await this.hydrateSessionConfigOptions(record.id, record);\n if (hydrated.modes && hydrated.modes.availableModes.length > 0) {\n return cloneModes(hydrated.modes);\n }\n\n const derived = deriveModesFromConfigOptions(hydrated.configOptions);\n if (!derived) {\n return cloneModes(hydrated.modes);\n }\n\n const updated: SessionRecord = {\n ...hydrated,\n modes: derived,\n };\n await this.persist.updateSession(updated);\n return cloneModes(derived);\n }\n\n private async setSessionCategoryValue(\n sessionId: string,\n category: string,\n value: string,\n ): Promise<{ session: Session; response: SetSessionConfigOptionResponse }> {\n const resolvedValue = value.trim();\n if (!resolvedValue) {\n throw new Error(`setSession${toTitleCase(category)} requires a non-empty value`);\n }\n\n const options = await this.getSessionConfigOptions(sessionId);\n const option = findConfigOptionByCategory(options, category);\n if (!option) {\n const categories = uniqueCategories(options);\n throw new UnsupportedSessionCategoryError(sessionId, category, categories);\n }\n\n const allowedValues = extractConfigValues(option);\n if (allowedValues.length > 0 && !allowedValues.includes(resolvedValue)) {\n throw new UnsupportedSessionValueError(sessionId, category, option.id, resolvedValue, allowedValues);\n }\n\n return this.setSessionConfigOption(sessionId, option.id, resolvedValue);\n }\n\n private async hydrateSessionConfigOptions(sessionId: string, snapshot: SessionRecord): Promise<SessionRecord> {\n if (snapshot.configOptions !== undefined) {\n return snapshot;\n }\n\n const info = await this.getAgent(snapshot.agent, { config: true });\n let configOptions = normalizeSessionConfigOptions(info.configOptions) ?? [];\n // Re-read the record from persistence so we merge against the latest\n // state, not a stale snapshot captured before the network await.\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n return { ...snapshot, configOptions };\n }\n\n const currentModeId = record.modes?.currentModeId;\n if (currentModeId) {\n const modeOption = findConfigOptionByCategory(configOptions, \"mode\");\n if (modeOption) {\n configOptions = applyConfigOptionValue(configOptions, modeOption.id, currentModeId) ?? configOptions;\n }\n }\n\n const updated: SessionRecord = {\n ...record,\n configOptions,\n modes: deriveModesFromConfigOptions(configOptions) ?? record.modes,\n };\n await this.persist.updateSession(updated);\n return updated;\n }\n\n async rawSendSessionMethod(\n sessionId: string,\n method: string,\n params: Record<string, unknown>,\n options: SessionSendOptions = {},\n ): Promise<{ session: Session; response: unknown }> {\n return this.sendSessionMethodInternal(sessionId, method, params, options, false);\n }\n\n private async sendSessionMethodInternal(\n sessionId: string,\n method: string,\n params: Record<string, unknown>,\n options: SessionSendOptions,\n allowManagedCancel: boolean,\n ): Promise<{ session: Session; response: unknown }> {\n if (method === SESSION_CANCEL_METHOD && !allowManagedCancel) {\n throw new Error(MANUAL_CANCEL_ERROR);\n }\n\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n throw new Error(`session '${sessionId}' not found`);\n }\n\n const live = await this.getLiveConnection(record.agent);\n if (!live.hasBoundSession(record.id, record.agentSessionId)) {\n // The persisted session points at a stale connection; restore lazily.\n const restored = await this.resumeSession(record.id);\n return this.sendSessionMethodInternal(restored.id, method, params, options, allowManagedCancel);\n }\n\n const response = await live.sendSessionMethod(record.id, method, params, options);\n await this.persistSessionStateFromMethod(record.id, method, params, response);\n const refreshed = await this.requireSessionRecord(record.id);\n return {\n session: this.upsertSessionHandle(refreshed),\n response,\n };\n }\n\n private async persistSessionStateFromMethod(sessionId: string, method: string, params: Record<string, unknown>, response: unknown): Promise<void> {\n // Re-read the record from persistence so we merge against the latest\n // state, not a stale snapshot captured before the RPC await.\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n return;\n }\n\n if (method === \"session/set_config_option\") {\n const configId = typeof params.configId === \"string\" ? params.configId : null;\n const value = typeof params.value === \"string\" ? params.value : null;\n const updates: Partial<SessionRecord> = {};\n\n const serverConfigOptions = extractConfigOptionsFromSetResponse(response);\n if (serverConfigOptions) {\n updates.configOptions = cloneConfigOptions(serverConfigOptions);\n } else if (record.configOptions && configId && value) {\n // Server didn't return configOptions — optimistically update the\n // cached currentValue so subsequent getConfigOptions() reflects the\n // change without a round-trip.\n const updated = applyConfigOptionValue(record.configOptions, configId, value);\n if (updated) {\n updates.configOptions = updated;\n }\n }\n\n // When a mode-category config option is set via set_config_option\n // (fallback path from setSessionMode), keep modes.currentModeId in sync.\n if (configId && value) {\n const source = updates.configOptions ?? record.configOptions;\n const option = source ? findConfigOptionById(source, configId) : null;\n if (option?.category === \"mode\") {\n const nextModes = applyCurrentMode(record.modes, value);\n if (nextModes) {\n updates.modes = nextModes;\n }\n }\n }\n\n if (Object.keys(updates).length > 0) {\n await this.persist.updateSession({ ...record, ...updates });\n }\n return;\n }\n\n if (method === \"session/set_mode\") {\n const modeId = typeof params.modeId === \"string\" ? params.modeId : null;\n if (!modeId) {\n return;\n }\n const updates: Partial<SessionRecord> = {};\n const nextModes = applyCurrentMode(record.modes, modeId);\n if (nextModes) {\n updates.modes = nextModes;\n }\n // Keep configOptions mode-category currentValue in sync with the new\n // mode, mirroring the reverse sync in the set_config_option path above.\n if (record.configOptions) {\n const modeOption = findConfigOptionByCategory(record.configOptions, \"mode\");\n if (modeOption) {\n const updated = applyConfigOptionValue(record.configOptions, modeOption.id, modeId);\n if (updated) {\n updates.configOptions = updated;\n }\n }\n }\n if (Object.keys(updates).length > 0) {\n await this.persist.updateSession({ ...record, ...updates });\n }\n }\n }\n\n onSessionEvent(sessionId: string, listener: SessionEventListener): () => void {\n const listeners = this.eventListeners.get(sessionId) ?? new Set<SessionEventListener>();\n listeners.add(listener);\n this.eventListeners.set(sessionId, listeners);\n\n return () => {\n const set = this.eventListeners.get(sessionId);\n if (!set) {\n return;\n }\n set.delete(listener);\n if (set.size === 0) {\n this.eventListeners.delete(sessionId);\n }\n };\n }\n\n onPermissionRequest(sessionId: string, listener: PermissionRequestListener): () => void {\n const listeners = this.permissionListeners.get(sessionId) ?? new Set<PermissionRequestListener>();\n listeners.add(listener);\n this.permissionListeners.set(sessionId, listeners);\n\n return () => {\n const set = this.permissionListeners.get(sessionId);\n if (!set) {\n return;\n }\n set.delete(listener);\n if (set.size === 0) {\n this.permissionListeners.delete(sessionId);\n }\n };\n }\n\n async respondPermission(permissionId: string, reply: PermissionReply): Promise<void> {\n const pending = this.pendingPermissionRequests.get(permissionId);\n if (!pending) {\n throw new Error(`permission '${permissionId}' not found`);\n }\n\n let response: RequestPermissionResponse;\n try {\n response = permissionReplyToResponse(permissionId, pending.request, reply);\n } catch (error) {\n pending.reject(error instanceof Error ? error : new Error(String(error)));\n this.pendingPermissionRequests.delete(permissionId);\n throw error;\n }\n this.resolvePendingPermission(permissionId, response);\n }\n\n async rawRespondPermission(permissionId: string, response: RequestPermissionResponse): Promise<void> {\n if (!this.pendingPermissionRequests.has(permissionId)) {\n throw new Error(`permission '${permissionId}' not found`);\n }\n this.resolvePendingPermission(permissionId, clonePermissionResponse(response));\n }\n\n async getHealth(): Promise<HealthResponse> {\n return this.requestHealth();\n }\n\n async listAgents(options?: AgentQueryOptions): Promise<AgentListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/agents`, {\n query: toAgentQuery(options),\n });\n }\n\n async getAgent(agent: string, options?: AgentQueryOptions): Promise<AgentInfo> {\n try {\n return await this.requestJson(\"GET\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}`, {\n query: toAgentQuery(options),\n });\n } catch (error) {\n if (!(error instanceof SandboxAgentError) || error.status !== 404) {\n throw error;\n }\n\n const listed = await this.listAgents(options);\n const match = listed.agents.find((entry) => entry.id === agent);\n if (match) {\n return match;\n }\n throw error;\n }\n }\n\n async installAgent(agent: string, request: AgentInstallRequest = {}): Promise<AgentInstallResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/agents/${encodeURIComponent(agent)}/install`, {\n body: request,\n });\n }\n\n async listAcpServers(): Promise<AcpServerListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/acp`);\n }\n\n async listFsEntries(query: FsEntriesQuery = {}): Promise<FsEntry[]> {\n return this.requestJson(\"GET\", `${FS_PATH}/entries`, {\n query,\n });\n }\n\n async readFsFile(query: FsPathQuery): Promise<Uint8Array> {\n const response = await this.requestRaw(\"GET\", `${FS_PATH}/file`, {\n query,\n accept: \"application/octet-stream\",\n });\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n async writeFsFile(query: FsPathQuery, body: BodyInit): Promise<FsWriteResponse> {\n const response = await this.requestRaw(\"PUT\", `${FS_PATH}/file`, {\n query,\n rawBody: body,\n contentType: \"application/octet-stream\",\n accept: \"application/json\",\n });\n return (await response.json()) as FsWriteResponse;\n }\n\n async deleteFsEntry(query: FsDeleteQuery): Promise<FsActionResponse> {\n return this.requestJson(\"DELETE\", `${FS_PATH}/entry`, { query });\n }\n\n async mkdirFs(query: FsPathQuery): Promise<FsActionResponse> {\n return this.requestJson(\"POST\", `${FS_PATH}/mkdir`, { query });\n }\n\n async moveFs(request: FsMoveRequest): Promise<FsMoveResponse> {\n return this.requestJson(\"POST\", `${FS_PATH}/move`, { body: request });\n }\n\n async statFs(query: FsPathQuery): Promise<FsStat> {\n return this.requestJson(\"GET\", `${FS_PATH}/stat`, { query });\n }\n\n async uploadFsBatch(body: BodyInit, query?: FsUploadBatchQuery): Promise<FsUploadBatchResponse> {\n const response = await this.requestRaw(\"POST\", `${FS_PATH}/upload-batch`, {\n query,\n rawBody: body,\n contentType: \"application/x-tar\",\n accept: \"application/json\",\n });\n return (await response.json()) as FsUploadBatchResponse;\n }\n\n async getMcpConfig(query: McpConfigQuery): Promise<McpServerConfig> {\n return this.requestJson(\"GET\", `${API_PREFIX}/config/mcp`, { query });\n }\n\n async setMcpConfig(query: McpConfigQuery, config: McpServerConfig): Promise<void> {\n await this.requestRaw(\"PUT\", `${API_PREFIX}/config/mcp`, { query, body: config });\n }\n\n async deleteMcpConfig(query: McpConfigQuery): Promise<void> {\n await this.requestRaw(\"DELETE\", `${API_PREFIX}/config/mcp`, { query });\n }\n\n async getSkillsConfig(query: SkillsConfigQuery): Promise<SkillsConfig> {\n return this.requestJson(\"GET\", `${API_PREFIX}/config/skills`, { query });\n }\n\n async setSkillsConfig(query: SkillsConfigQuery, config: SkillsConfig): Promise<void> {\n await this.requestRaw(\"PUT\", `${API_PREFIX}/config/skills`, { query, body: config });\n }\n\n async deleteSkillsConfig(query: SkillsConfigQuery): Promise<void> {\n await this.requestRaw(\"DELETE\", `${API_PREFIX}/config/skills`, { query });\n }\n\n async getProcessConfig(): Promise<ProcessConfig> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes/config`);\n }\n\n async setProcessConfig(config: ProcessConfig): Promise<ProcessConfig> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/config`, {\n body: config,\n });\n }\n\n async createProcess(request: ProcessCreateRequest): Promise<ProcessInfo> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes`, {\n body: request,\n });\n }\n\n async runProcess(request: ProcessRunRequest): Promise<ProcessRunResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/run`, {\n body: request,\n });\n }\n\n async listProcesses(): Promise<ProcessListResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes`);\n }\n\n async getProcess(id: string): Promise<ProcessInfo> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes/${encodeURIComponent(id)}`);\n }\n\n async stopProcess(id: string, query?: ProcessSignalQuery): Promise<ProcessInfo> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/stop`, {\n query,\n });\n }\n\n async killProcess(id: string, query?: ProcessSignalQuery): Promise<ProcessInfo> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/kill`, {\n query,\n });\n }\n\n async deleteProcess(id: string): Promise<void> {\n await this.requestRaw(\"DELETE\", `${API_PREFIX}/processes/${encodeURIComponent(id)}`);\n }\n\n async getProcessLogs(id: string, query: ProcessLogFollowQuery = {}): Promise<ProcessLogsResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/logs`, {\n query,\n });\n }\n\n async followProcessLogs(id: string, listener: ProcessLogListener, query: ProcessLogFollowQuery = {}): Promise<ProcessLogSubscription> {\n const abortController = new AbortController();\n const response = await this.requestRaw(\"GET\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/logs`, {\n query: { ...query, follow: true },\n accept: \"text/event-stream\",\n signal: abortController.signal,\n });\n\n if (!response.body) {\n abortController.abort();\n throw new Error(\"SSE stream is not readable in this environment.\");\n }\n\n const closed = consumeProcessLogSse(response.body, listener, abortController.signal);\n\n return {\n close: () => abortController.abort(),\n closed,\n };\n }\n\n async sendProcessInput(id: string, request: ProcessInputRequest): Promise<ProcessInputResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/input`, {\n body: request,\n });\n }\n\n async resizeProcessTerminal(id: string, request: ProcessTerminalResizeRequest): Promise<ProcessTerminalResizeResponse> {\n return this.requestJson(\"POST\", `${API_PREFIX}/processes/${encodeURIComponent(id)}/terminal/resize`, {\n body: request,\n });\n }\n\n buildProcessTerminalWebSocketUrl(id: string, options: ProcessTerminalWebSocketUrlOptions = {}): string {\n return toWebSocketUrl(\n this.buildUrl(`${API_PREFIX}/processes/${encodeURIComponent(id)}/terminal/ws`, {\n access_token: options.accessToken ?? this.token,\n }),\n );\n }\n\n connectProcessTerminalWebSocket(id: string, options: ProcessTerminalConnectOptions = {}): WebSocket {\n const WebSocketCtor = options.WebSocket ?? globalThis.WebSocket;\n if (!WebSocketCtor) {\n throw new Error(\"WebSocket API is not available; provide a WebSocket implementation.\");\n }\n\n return new WebSocketCtor(\n this.buildProcessTerminalWebSocketUrl(id, {\n accessToken: options.accessToken,\n }),\n options.protocols,\n );\n }\n\n connectProcessTerminal(id: string, options: ProcessTerminalSessionOptions = {}): ProcessTerminalSession {\n return new ProcessTerminalSession(this.connectProcessTerminalWebSocket(id, options));\n }\n\n private async getLiveConnection(agent: string): Promise<LiveAcpConnection> {\n await this.awaitHealthy();\n\n const existing = this.liveConnections.get(agent);\n if (existing) {\n return existing;\n }\n\n const pending = this.pendingLiveConnections.get(agent);\n if (pending) {\n return pending;\n }\n\n const creating = (async () => {\n const serverId = `sdk-${agent}-${randomId()}`;\n const created = await LiveAcpConnection.create({\n baseUrl: this.baseUrl,\n token: this.token,\n fetcher: this.fetcher,\n headers: this.defaultHeaders,\n agent,\n serverId,\n onObservedEnvelope: (connection, envelope, direction, localSessionId) => {\n void this.persistObservedEnvelope(connection, envelope, direction, localSessionId);\n },\n onPermissionRequest: async (connection, localSessionId, agentSessionId, request) =>\n this.enqueuePermissionRequest(connection, localSessionId, agentSessionId, request),\n });\n\n const raced = this.liveConnections.get(agent);\n if (raced) {\n await created.close();\n return raced;\n }\n\n this.liveConnections.set(agent, created);\n return created;\n })();\n\n this.pendingLiveConnections.set(agent, creating);\n try {\n return await creating;\n } finally {\n if (this.pendingLiveConnections.get(agent) === creating) {\n this.pendingLiveConnections.delete(agent);\n }\n }\n }\n\n private async persistObservedEnvelope(\n connection: LiveAcpConnection,\n envelope: AnyMessage,\n direction: AcpEnvelopeDirection,\n localSessionId: string | null,\n ): Promise<void> {\n if (!localSessionId) {\n return;\n }\n\n const event: SessionEvent = {\n id: randomId(),\n eventIndex: await this.allocateSessionEventIndex(localSessionId),\n sessionId: localSessionId,\n createdAt: nowMs(),\n connectionId: connection.connectionId,\n sender: direction === \"outbound\" ? \"client\" : \"agent\",\n payload: cloneEnvelope(envelope),\n };\n\n await this.persist.insertEvent(event);\n await this.persistSessionStateFromEvent(localSessionId, envelope, direction);\n\n const listeners = this.eventListeners.get(localSessionId);\n if (!listeners || listeners.size === 0) {\n return;\n }\n\n for (const listener of listeners) {\n listener(event);\n }\n }\n\n private async persistSessionStateFromEvent(sessionId: string, envelope: AnyMessage, direction: AcpEnvelopeDirection): Promise<void> {\n if (direction !== \"inbound\") {\n return;\n }\n\n if (envelopeMethod(envelope) !== \"session/update\") {\n return;\n }\n\n const update = envelopeSessionUpdate(envelope);\n if (!update || typeof update.sessionUpdate !== \"string\") {\n return;\n }\n\n const record = await this.persist.getSession(sessionId);\n if (!record) {\n return;\n }\n\n if (update.sessionUpdate === \"config_option_update\") {\n const configOptions = normalizeSessionConfigOptions(update.configOptions);\n if (configOptions) {\n await this.persist.updateSession({\n ...record,\n configOptions,\n });\n }\n return;\n }\n\n if (update.sessionUpdate === \"current_mode_update\") {\n const modeId = typeof update.currentModeId === \"string\" ? update.currentModeId : null;\n if (!modeId) {\n return;\n }\n const nextModes = applyCurrentMode(record.modes, modeId);\n if (!nextModes) {\n return;\n }\n await this.persist.updateSession({\n ...record,\n modes: nextModes,\n });\n }\n }\n\n private async allocateSessionEventIndex(sessionId: string): Promise<number> {\n await this.ensureSessionEventIndexSeeded(sessionId);\n const nextIndex = this.nextSessionEventIndexBySession.get(sessionId) ?? 1;\n this.nextSessionEventIndexBySession.set(sessionId, nextIndex + 1);\n return nextIndex;\n }\n\n private async ensureSessionEventIndexSeeded(sessionId: string): Promise<void> {\n if (this.nextSessionEventIndexBySession.has(sessionId)) {\n return;\n }\n\n if (!this.seedSessionEventIndexBySession.has(sessionId)) {\n const pending = (async () => {\n const maxPersistedIndex = await this.findMaxPersistedSessionEventIndex(sessionId);\n this.nextSessionEventIndexBySession.set(sessionId, Math.max(1, maxPersistedIndex + 1));\n })().finally(() => {\n this.seedSessionEventIndexBySession.delete(sessionId);\n });\n this.seedSessionEventIndexBySession.set(sessionId, pending);\n }\n\n const pending = this.seedSessionEventIndexBySession.get(sessionId);\n if (pending) {\n await pending;\n }\n }\n\n private async findMaxPersistedSessionEventIndex(sessionId: string): Promise<number> {\n let maxIndex = 0;\n let eventCursor: string | undefined;\n\n while (true) {\n const eventsPage = await this.persist.listEvents({\n sessionId,\n cursor: eventCursor,\n limit: EVENT_INDEX_SCAN_EVENTS_LIMIT,\n });\n\n for (const event of eventsPage.items) {\n if (Number.isFinite(event.eventIndex) && event.eventIndex > maxIndex) {\n maxIndex = Math.floor(event.eventIndex);\n }\n }\n\n if (!eventsPage.nextCursor) {\n break;\n }\n eventCursor = eventsPage.nextCursor;\n }\n\n return maxIndex;\n }\n\n private async collectReplayEvents(sessionId: string, maxEvents: number): Promise<SessionEvent[]> {\n const all: SessionEvent[] = [];\n let cursor: string | undefined;\n\n while (true) {\n const page = await this.persist.listEvents({\n sessionId,\n cursor,\n limit: Math.max(100, maxEvents),\n });\n\n all.push(...page.items);\n\n if (!page.nextCursor) {\n break;\n }\n\n cursor = page.nextCursor;\n }\n\n return all.slice(-maxEvents);\n }\n\n private upsertSessionHandle(record: SessionRecord): Session {\n const existing = this.sessionHandles.get(record.id);\n if (existing) {\n existing.apply(record);\n return existing;\n }\n\n const created = new Session(this, record);\n this.sessionHandles.set(record.id, created);\n return created;\n }\n\n private async requireSessionRecord(id: string): Promise<SessionRecord> {\n const record = await this.persist.getSession(id);\n if (!record) {\n throw new Error(`session '${id}' not found`);\n }\n return record;\n }\n\n private async enqueuePermissionRequest(\n _connection: LiveAcpConnection,\n localSessionId: string,\n agentSessionId: string,\n request: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse> {\n const listeners = this.permissionListeners.get(localSessionId);\n if (!listeners || listeners.size === 0) {\n return cancelledPermissionResponse();\n }\n\n const pendingId = randomId();\n const permissionRequest: SessionPermissionRequest = {\n id: pendingId,\n createdAt: nowMs(),\n sessionId: localSessionId,\n agentSessionId,\n availableReplies: availablePermissionReplies(request.options),\n options: request.options.map(clonePermissionOption),\n toolCall: clonePermissionToolCall(request.toolCall),\n rawRequest: clonePermissionRequest(request),\n };\n\n return await new Promise<RequestPermissionResponse>((resolve, reject) => {\n this.pendingPermissionRequests.set(pendingId, {\n id: pendingId,\n sessionId: localSessionId,\n request: clonePermissionRequest(request),\n resolve,\n reject,\n });\n\n try {\n for (const listener of listeners) {\n listener(permissionRequest);\n }\n } catch (error) {\n this.pendingPermissionRequests.delete(pendingId);\n reject(error);\n }\n });\n }\n\n private resolvePendingPermission(permissionId: string, response: RequestPermissionResponse): void {\n const pending = this.pendingPermissionRequests.get(permissionId);\n if (!pending) {\n throw new Error(`permission '${permissionId}' not found`);\n }\n\n this.pendingPermissionRequests.delete(permissionId);\n pending.resolve(response);\n }\n\n private cancelPendingPermissionsForSession(sessionId: string): void {\n for (const [permissionId, pending] of this.pendingPermissionRequests) {\n if (pending.sessionId !== sessionId) {\n continue;\n }\n this.pendingPermissionRequests.delete(permissionId);\n pending.resolve(cancelledPermissionResponse());\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 signal: options.signal,\n skipReadyWait: options.skipReadyWait,\n });\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n }\n\n private async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n if (!options.skipReadyWait) {\n await this.awaitHealthy(options.signal);\n }\n\n const url = this.buildUrl(path, options.query);\n const headers = this.buildHeaders(options.headers);\n\n if (options.accept) {\n headers.set(\"Accept\", options.accept);\n }\n\n const init: RequestInit = {\n method,\n headers,\n signal: options.signal,\n };\n\n if (options.rawBody !== undefined && options.body !== undefined) {\n throw new Error(\"requestRaw received both rawBody and body\");\n }\n\n if (options.rawBody !== undefined) {\n if (options.contentType) {\n headers.set(\"Content-Type\", options.contentType);\n }\n init.body = options.rawBody;\n } else if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n init.body = JSON.stringify(options.body);\n }\n\n const response = await this.fetcher(url, init);\n if (!response.ok) {\n const problem = await readProblem(response);\n throw new SandboxAgentError(response.status, problem, response);\n }\n\n return response;\n }\n\n private startHealthWait(): void {\n if (!this.healthWait.enabled || this.healthPromise) {\n return;\n }\n\n this.healthPromise = this.runHealthWait().catch((error) => {\n this.healthError = error instanceof Error ? error : new Error(String(error));\n });\n }\n\n private async awaitHealthy(signal?: AbortSignal): Promise<void> {\n if (!this.healthPromise) {\n throwIfAborted(signal);\n return;\n }\n\n await waitForAbortable(this.healthPromise, signal);\n throwIfAborted(signal);\n if (this.healthError) {\n throw this.healthError;\n }\n }\n\n private async runHealthWait(): Promise<void> {\n const signal = this.healthWait.enabled ? anyAbortSignal([this.healthWait.signal, this.healthWaitAbortController.signal]) : undefined;\n const startedAt = Date.now();\n const deadline = typeof this.healthWait.timeoutMs === \"number\" ? startedAt + this.healthWait.timeoutMs : undefined;\n\n let delayMs = HEALTH_WAIT_MIN_DELAY_MS;\n let nextLogAt = startedAt + HEALTH_WAIT_LOG_AFTER_MS;\n let lastError: unknown;\n\n while (!this.disposed && (deadline === undefined || Date.now() < deadline)) {\n throwIfAborted(signal);\n\n try {\n const health = await this.requestHealth({ signal });\n if (health.status === \"ok\") {\n return;\n }\n lastError = new Error(`Unexpected health response: ${JSON.stringify(health)}`);\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n lastError = error;\n }\n\n const now = Date.now();\n if (now >= nextLogAt) {\n const details = formatHealthWaitError(lastError);\n console.warn(`sandbox-agent at ${this.baseUrl} is not healthy after ${now - startedAt}ms; still waiting (${details})`);\n nextLogAt = now + HEALTH_WAIT_LOG_EVERY_MS;\n }\n\n await sleep(delayMs, signal);\n delayMs = Math.min(HEALTH_WAIT_MAX_DELAY_MS, delayMs * 2);\n }\n\n if (this.disposed) {\n return;\n }\n\n throw new Error(`Timed out waiting for sandbox-agent health after ${this.healthWait.timeoutMs}ms (${formatHealthWaitError(lastError)})`);\n }\n\n private buildHeaders(extra?: HeadersInit): Headers {\n const headers = new Headers(this.defaultHeaders ?? undefined);\n\n if (this.token) {\n headers.set(\"Authorization\", `Bearer ${this.token}`);\n }\n\n if (extra) {\n const merged = new Headers(extra);\n merged.forEach((value, key) => headers.set(key, value));\n }\n\n return headers;\n }\n\n private buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n\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\n return url.toString();\n }\n\n private async requestHealth(options: { signal?: AbortSignal } = {}): Promise<HealthResponse> {\n return this.requestJson(\"GET\", `${API_PREFIX}/health`, {\n signal: options.signal,\n skipReadyWait: true,\n });\n }\n}\n\ntype PendingPermissionRequestState = {\n id: string;\n sessionId: string;\n request: RequestPermissionRequest;\n resolve: (response: RequestPermissionResponse) => void;\n reject: (reason?: unknown) => void;\n};\n\ntype QueryValue = string | number | boolean | null | undefined;\n\ntype RequestOptions = {\n query?: Record<string, QueryValue>;\n body?: unknown;\n rawBody?: BodyInit;\n contentType?: string;\n headers?: HeadersInit;\n accept?: string;\n signal?: AbortSignal;\n skipReadyWait?: boolean;\n};\n\ntype NormalizedHealthWaitOptions = { enabled: false; timeoutMs?: undefined; signal?: undefined } | { enabled: true; timeoutMs?: number; signal?: AbortSignal };\n\nfunction parseProcessTerminalServerFrame(payload: string): ProcessTerminalServerFrame | null {\n try {\n const parsed = JSON.parse(payload) as unknown;\n if (!isRecord(parsed) || typeof parsed.type !== \"string\") {\n return null;\n }\n\n if (parsed.type === \"ready\" && typeof parsed.processId === \"string\") {\n return parsed as ProcessTerminalServerFrame;\n }\n\n if (parsed.type === \"exit\" && (parsed.exitCode === undefined || parsed.exitCode === null || typeof parsed.exitCode === \"number\")) {\n return parsed as ProcessTerminalServerFrame;\n }\n\n if (parsed.type === \"error\" && typeof parsed.message === \"string\") {\n return parsed as ProcessTerminalServerFrame;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction encodeTerminalInput(data: string | ArrayBuffer | ArrayBufferView): { data: string; encoding?: \"base64\" } {\n if (typeof data === \"string\") {\n return { data };\n }\n\n const bytes = encodeTerminalBytes(data);\n return {\n data: bytesToBase64(bytes),\n encoding: \"base64\",\n };\n}\n\nfunction encodeTerminalBytes(data: ArrayBuffer | ArrayBufferView): Uint8Array {\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice();\n}\n\nasync function decodeTerminalBytes(data: unknown): Promise<Uint8Array> {\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice();\n }\n\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer());\n }\n\n throw new Error(`Unsupported terminal frame payload: ${String(data)}`);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes).toString(\"base64\");\n }\n\n if (typeof btoa === \"function\") {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize));\n }\n return btoa(binary);\n }\n\n throw new Error(\"Base64 encoding is not available in this environment.\");\n}\n\n/**\n * Auto-select and call `authenticate` based on the agent's advertised auth methods.\n * Prefers env-var-based methods that the server process already has configured.\n */\nasync function autoAuthenticate(acp: AcpHttpClient, methods: AuthMethod[]): Promise<void> {\n // Only attempt env-var-based methods that the server process can satisfy\n // automatically. Interactive methods (e.g. \"claude-login\") cannot be\n // fulfilled programmatically and must be skipped.\n const envBased = methods.find((m) => m.id === \"codex-api-key\" || m.id === \"openai-api-key\" || m.id === \"anthropic-api-key\");\n\n if (!envBased) {\n return;\n }\n\n try {\n await acp.authenticate({ methodId: envBased.id });\n } catch {\n // Authentication is best-effort; the agent may already have credentials\n // from env vars or credential files configured on the server side.\n }\n}\n\nfunction toAgentQuery(options: AgentQueryOptions | undefined): Record<string, QueryValue> | undefined {\n if (!options) {\n return undefined;\n }\n\n return {\n config: options.config,\n no_cache: options.noCache,\n };\n}\n\nfunction normalizeSessionInit(value: Omit<NewSessionRequest, \"_meta\"> | undefined): Omit<NewSessionRequest, \"_meta\"> {\n if (!value) {\n return {\n cwd: defaultCwd(),\n mcpServers: [],\n };\n }\n\n return {\n ...value,\n cwd: value.cwd ?? defaultCwd(),\n mcpServers: value.mcpServers ?? [],\n };\n}\n\nfunction mapSessionParams(params: Record<string, unknown>, agentSessionId: string): Record<string, unknown> {\n return {\n ...params,\n sessionId: agentSessionId,\n };\n}\n\nfunction injectReplayPrompt(params: Record<string, unknown>, replayText: string): void {\n const prompt = Array.isArray(params.prompt) ? [...params.prompt] : [];\n prompt.unshift({\n type: \"text\",\n text: replayText,\n });\n params.prompt = prompt;\n}\n\nfunction buildReplayText(events: SessionEvent[], maxChars: number): string | null {\n if (events.length === 0) {\n return null;\n }\n\n const prefix = \"Previous session history is replayed below as JSON-RPC envelopes. Use it as context before responding to the latest user prompt.\\n\";\n let text = prefix;\n\n for (const event of events) {\n const line = JSON.stringify({\n createdAt: event.createdAt,\n sender: event.sender,\n payload: event.payload,\n });\n\n if (text.length + line.length + 1 > maxChars) {\n text += \"\\n[history truncated]\";\n break;\n }\n\n text += `${line}\\n`;\n }\n\n return text;\n}\n\nfunction envelopeMethod(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"method\" in message) || typeof message[\"method\"] !== \"string\") {\n return null;\n }\n return message[\"method\"];\n}\n\nfunction envelopeId(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"id\" in message) || message[\"id\"] === undefined || message[\"id\"] === null) {\n return null;\n }\n return String(message[\"id\"]);\n}\n\nfunction envelopeSessionIdFromParams(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"params\" in message) || !isRecord(message[\"params\"])) {\n return null;\n }\n\n const params = message[\"params\"];\n if (typeof params.sessionId === \"string\" && params.sessionId.length > 0) {\n return params.sessionId;\n }\n\n return null;\n}\n\nfunction envelopeSessionIdFromResult(message: AnyMessage): string | null {\n if (!isRecord(message) || !(\"result\" in message) || !isRecord(message[\"result\"])) {\n return null;\n }\n\n const result = message[\"result\"];\n if (typeof result.sessionId === \"string\" && result.sessionId.length > 0) {\n return result.sessionId;\n }\n\n return null;\n}\n\nfunction cloneEnvelope(envelope: AnyMessage): AnyMessage {\n return JSON.parse(JSON.stringify(envelope)) as AnyMessage;\n}\n\nfunction clonePermissionRequest(request: RequestPermissionRequest): RequestPermissionRequest {\n return JSON.parse(JSON.stringify(request)) as RequestPermissionRequest;\n}\n\nfunction clonePermissionResponse(response: RequestPermissionResponse): RequestPermissionResponse {\n return JSON.parse(JSON.stringify(response)) as RequestPermissionResponse;\n}\n\nfunction clonePermissionOption(option: PermissionOption): SessionPermissionRequestOption {\n return {\n optionId: option.optionId,\n name: option.name,\n kind: option.kind,\n };\n}\n\nfunction clonePermissionToolCall(toolCall: RequestPermissionRequest[\"toolCall\"]): RequestPermissionRequest[\"toolCall\"] {\n return JSON.parse(JSON.stringify(toolCall)) as RequestPermissionRequest[\"toolCall\"];\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction randomId(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction defaultCwd(): string {\n if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n return process.cwd();\n }\n return \"/\";\n}\n\nfunction normalizePositiveInt(value: number | undefined, fallback: number): number {\n if (!Number.isFinite(value) || (value ?? 0) < 1) {\n return fallback;\n }\n return Math.floor(value as number);\n}\n\nfunction normalizeHealthWaitOptions(value: boolean | SandboxAgentHealthWaitOptions | undefined, signal: AbortSignal | undefined): NormalizedHealthWaitOptions {\n if (value === false) {\n return { enabled: false };\n }\n\n if (value === true || value === undefined) {\n return { enabled: true, signal };\n }\n\n const timeoutMs = typeof value.timeoutMs === \"number\" && Number.isFinite(value.timeoutMs) && value.timeoutMs > 0 ? Math.floor(value.timeoutMs) : undefined;\n\n return {\n enabled: true,\n signal,\n timeoutMs,\n };\n}\n\nfunction normalizeSpawnOptions(\n spawn: SandboxAgentSpawnOptions | boolean | undefined,\n defaultEnabled: boolean,\n): SandboxAgentSpawnOptions & { enabled: boolean } {\n if (spawn === false) {\n return { enabled: false };\n }\n\n if (spawn === true || spawn === undefined) {\n return { enabled: defaultEnabled };\n }\n\n return {\n ...spawn,\n enabled: spawn.enabled ?? defaultEnabled,\n };\n}\n\nasync function 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\nfunction normalizeSessionConfigOptions(value: unknown): SessionConfigOption[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const normalized = value.filter(isSessionConfigOption) as SessionConfigOption[];\n return cloneConfigOptions(normalized) ?? [];\n}\n\nfunction extractConfigOptionsFromSetResponse(response: unknown): SessionConfigOption[] | undefined {\n if (!isRecord(response)) {\n return undefined;\n }\n return normalizeSessionConfigOptions(response.configOptions);\n}\n\nfunction findConfigOptionByCategory(options: SessionConfigOption[], category: string): SessionConfigOption | undefined {\n return options.find((option) => option.category === category);\n}\n\nfunction findConfigOptionById(options: SessionConfigOption[], configId: string): SessionConfigOption | undefined {\n return options.find((option) => option.id === configId);\n}\n\nfunction uniqueCategories(options: SessionConfigOption[]): string[] {\n return [...new Set(options.map((option) => option.category).filter((value): value is string => !!value))].sort();\n}\n\nfunction extractConfigValues(option: SessionConfigOption): string[] {\n if (!isRecord(option) || option.type !== \"select\" || !Array.isArray(option.options)) {\n return [];\n }\n\n const values: string[] = [];\n for (const entry of option.options as unknown[]) {\n if (isRecord(entry) && typeof entry.value === \"string\") {\n values.push(entry.value);\n continue;\n }\n if (isRecord(entry) && Array.isArray(entry.options)) {\n for (const nested of entry.options) {\n if (isRecord(nested) && typeof nested.value === \"string\") {\n values.push(nested.value);\n }\n }\n }\n }\n\n return [...new Set(values)];\n}\n\nfunction extractKnownModeIds(modes: SessionModeState | null | undefined): string[] {\n if (!modes || !Array.isArray(modes.availableModes)) {\n return [];\n }\n return modes.availableModes.map((mode) => (typeof mode.id === \"string\" ? mode.id : null)).filter((value): value is string => !!value);\n}\n\nfunction deriveModesFromConfigOptions(configOptions: SessionConfigOption[] | undefined): SessionModeState | null {\n if (!configOptions || configOptions.length === 0) {\n return null;\n }\n\n const modeOption = findConfigOptionByCategory(configOptions, \"mode\");\n if (!modeOption || !Array.isArray(modeOption.options)) {\n return null;\n }\n\n const availableModes = modeOption.options\n .flatMap((entry) => flattenConfigOptions(entry))\n .map((entry) => ({\n id: entry.value,\n name: entry.name,\n description: entry.description ?? null,\n }));\n\n return {\n currentModeId: typeof modeOption.currentValue === \"string\" && modeOption.currentValue.length > 0 ? modeOption.currentValue : (availableModes[0]?.id ?? \"\"),\n availableModes,\n };\n}\n\nfunction applyCurrentMode(modes: SessionModeState | null | undefined, currentModeId: string): SessionModeState | null {\n if (modes && Array.isArray(modes.availableModes)) {\n return {\n ...modes,\n currentModeId,\n };\n }\n return {\n currentModeId,\n availableModes: [],\n };\n}\n\nfunction applyConfigOptionValue(configOptions: SessionConfigOption[], configId: string, value: string): SessionConfigOption[] | null {\n const idx = configOptions.findIndex((o) => o.id === configId);\n if (idx === -1) {\n return null;\n }\n const updated = cloneConfigOptions(configOptions) ?? [];\n updated[idx] = { ...updated[idx]!, currentValue: value };\n return updated;\n}\n\nfunction flattenConfigOptions(entry: unknown): Array<{ value: string; name: string; description?: string }> {\n if (!isRecord(entry)) {\n return [];\n }\n if (typeof entry.value === \"string\" && typeof entry.name === \"string\") {\n return [\n {\n value: entry.value,\n name: entry.name,\n description: typeof entry.description === \"string\" ? entry.description : undefined,\n },\n ];\n }\n if (!Array.isArray(entry.options)) {\n return [];\n }\n return entry.options.flatMap((nested) => flattenConfigOptions(nested));\n}\n\nfunction envelopeSessionUpdate(message: AnyMessage): Record<string, unknown> | null {\n if (!isRecord(message) || !(\"params\" in message) || !isRecord(message.params)) {\n return null;\n }\n if (!(\"update\" in message.params) || !isRecord(message.params.update)) {\n return null;\n }\n return message.params.update;\n}\n\nfunction cloneConfigOptions(value: SessionConfigOption[] | null | undefined): SessionConfigOption[] | undefined {\n if (!value) {\n return undefined;\n }\n return JSON.parse(JSON.stringify(value)) as SessionConfigOption[];\n}\n\nfunction cloneModes(value: SessionModeState | null | undefined): SessionModeState | null {\n if (!value) {\n return null;\n }\n return JSON.parse(JSON.stringify(value)) as SessionModeState;\n}\n\nfunction availablePermissionReplies(options: PermissionOption[]): PermissionReply[] {\n const replies = new Set<PermissionReply>();\n for (const option of options) {\n if (option.kind === \"allow_once\") {\n replies.add(\"once\");\n } else if (option.kind === \"allow_always\") {\n replies.add(\"always\");\n } else if (option.kind === \"reject_once\" || option.kind === \"reject_always\") {\n replies.add(\"reject\");\n }\n }\n return [...replies];\n}\n\nfunction permissionReplyToResponse(permissionId: string, request: RequestPermissionRequest, reply: PermissionReply): RequestPermissionResponse {\n const preferredKinds: PermissionOptionKind[] =\n reply === \"once\" ? [\"allow_once\"] : reply === \"always\" ? [\"allow_always\", \"allow_once\"] : [\"reject_once\", \"reject_always\"];\n\n const selected = preferredKinds\n .map((kind) => request.options.find((option) => option.kind === kind))\n .find((option): option is PermissionOption => Boolean(option));\n\n if (!selected) {\n throw new UnsupportedPermissionReplyError(permissionId, reply, availablePermissionReplies(request.options));\n }\n\n return {\n outcome: {\n outcome: \"selected\",\n optionId: selected.optionId,\n },\n };\n}\n\nfunction cancelledPermissionResponse(): RequestPermissionResponse {\n return {\n outcome: {\n outcome: \"cancelled\",\n },\n };\n}\n\nfunction isSessionConfigOption(value: unknown): value is SessionConfigOption {\n return isRecord(value) && typeof value.id === \"string\" && typeof value.name === \"string\" && typeof value.type === \"string\";\n}\n\nfunction toTitleCase(input: string): string {\n if (!input) {\n return \"\";\n }\n return input\n .split(/[_\\s-]+/)\n .filter(Boolean)\n .map((part) => part[0]!.toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction formatHealthWaitError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n\n if (error === undefined || error === null) {\n return \"unknown error\";\n }\n\n return String(error);\n}\n\nfunction anyAbortSignal(signals: Array<AbortSignal | undefined>): AbortSignal | undefined {\n const active = signals.filter((signal): signal is AbortSignal => Boolean(signal));\n if (active.length === 0) {\n return undefined;\n }\n\n if (active.length === 1) {\n return active[0];\n }\n\n const controller = new AbortController();\n const onAbort = (event: Event) => {\n cleanup();\n const signal = event.target as AbortSignal;\n controller.abort(signal.reason ?? createAbortError());\n };\n const cleanup = () => {\n for (const signal of active) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n for (const signal of active) {\n if (signal.aborted) {\n controller.abort(signal.reason ?? createAbortError());\n return controller.signal;\n }\n }\n\n for (const signal of active) {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return controller.signal;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) {\n return;\n }\n\n throw signal.reason instanceof Error ? signal.reason : createAbortError(signal.reason);\n}\n\nasync function waitForAbortable<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {\n if (!signal) {\n return promise;\n }\n\n throwIfAborted(signal);\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n reject(signal.reason instanceof Error ? signal.reason : createAbortError(signal.reason));\n };\n const cleanup = () => {\n signal.removeEventListener(\"abort\", onAbort);\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n });\n}\n\nasync function consumeProcessLogSse(body: ReadableStream<Uint8Array>, listener: ProcessLogListener, signal: AbortSignal): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n\n let separatorIndex = buffer.indexOf(\"\\n\\n\");\n while (separatorIndex !== -1) {\n const chunk = buffer.slice(0, separatorIndex);\n buffer = buffer.slice(separatorIndex + 2);\n\n const entry = parseProcessLogSseChunk(chunk);\n if (entry) {\n listener(entry);\n }\n\n separatorIndex = buffer.indexOf(\"\\n\\n\");\n }\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) {\n return;\n }\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction parseProcessLogSseChunk(chunk: string): ProcessLogEntry | null {\n if (!chunk.trim()) {\n return null;\n }\n\n let eventName = \"message\";\n const dataLines: string[] = [];\n\n for (const line of chunk.split(\"\\n\")) {\n if (!line || line.startsWith(\":\")) {\n continue;\n }\n\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(6).trim();\n continue;\n }\n\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).trimStart());\n }\n }\n\n if (eventName !== \"log\") {\n return null;\n }\n\n const data = dataLines.join(\"\\n\");\n if (!data.trim()) {\n return null;\n }\n\n return JSON.parse(data) as ProcessLogEntry;\n}\n\nfunction toWebSocketUrl(url: string): string {\n const parsed = new URL(url);\n if (parsed.protocol === \"http:\") {\n parsed.protocol = \"ws:\";\n } else if (parsed.protocol === \"https:\") {\n parsed.protocol = \"wss:\";\n }\n return parsed.toString();\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction createAbortError(reason?: unknown): Error {\n if (reason instanceof Error) {\n return reason;\n }\n\n const message = typeof reason === \"string\" ? reason : \"This operation was aborted.\";\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(message, \"AbortError\");\n }\n\n const error = new Error(message);\n error.name = \"AbortError\";\n return error;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n throwIfAborted(signal);\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = () => {\n cleanup();\n reject(signal.reason instanceof Error ? signal.reason : createAbortError(signal.reason));\n };\n const cleanup = () => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import type { AnyMessage, NewSessionRequest, SessionConfigOption, SessionModeState } from \"acp-http-client\";\nimport type { components, operations } from \"./generated/openapi.ts\";\n\nexport type ProblemDetails = components[\"schemas\"][\"ProblemDetails\"];\n\nexport type HealthResponse = JsonResponse<operations[\"get_v1_health\"], 200>;\nexport type AgentListResponse = JsonResponse<operations[\"get_v1_agents\"], 200>;\nexport type AgentInfo = components[\"schemas\"][\"AgentInfo\"];\nexport type AgentQuery = QueryParams<operations[\"get_v1_agents\"]>;\nexport type AgentInstallRequest = JsonRequestBody<operations[\"post_v1_agent_install\"]>;\nexport type AgentInstallResponse = JsonResponse<operations[\"post_v1_agent_install\"], 200>;\n\nexport type AcpEnvelope = components[\"schemas\"][\"AcpEnvelope\"];\nexport type AcpServerInfo = components[\"schemas\"][\"AcpServerInfo\"];\nexport type AcpServerListResponse = JsonResponse<operations[\"get_v1_acp_servers\"], 200>;\n\nexport type FsEntriesQuery = QueryParams<operations[\"get_v1_fs_entries\"]>;\nexport type FsEntry = components[\"schemas\"][\"FsEntry\"];\nexport type FsPathQuery = QueryParams<operations[\"get_v1_fs_file\"]>;\nexport type FsDeleteQuery = QueryParams<operations[\"delete_v1_fs_entry\"]>;\nexport type FsUploadBatchQuery = QueryParams<operations[\"post_v1_fs_upload_batch\"]>;\nexport type FsWriteResponse = JsonResponse<operations[\"put_v1_fs_file\"], 200>;\nexport type FsActionResponse = JsonResponse<operations[\"delete_v1_fs_entry\"], 200>;\nexport type FsMoveRequest = JsonRequestBody<operations[\"post_v1_fs_move\"]>;\nexport type FsMoveResponse = JsonResponse<operations[\"post_v1_fs_move\"], 200>;\nexport type FsStat = JsonResponse<operations[\"get_v1_fs_stat\"], 200>;\nexport type FsUploadBatchResponse = JsonResponse<operations[\"post_v1_fs_upload_batch\"], 200>;\n\nexport type McpConfigQuery = QueryParams<operations[\"get_v1_config_mcp\"]>;\nexport type McpServerConfig = components[\"schemas\"][\"McpServerConfig\"];\n\nexport type SkillsConfigQuery = QueryParams<operations[\"get_v1_config_skills\"]>;\nexport type SkillsConfig = components[\"schemas\"][\"SkillsConfig\"];\n\nexport type ProcessConfig = JsonResponse<operations[\"get_v1_processes_config\"], 200>;\nexport type ProcessCreateRequest = JsonRequestBody<operations[\"post_v1_processes\"]>;\nexport type ProcessInfo = components[\"schemas\"][\"ProcessInfo\"];\nexport type ProcessInputRequest = JsonRequestBody<operations[\"post_v1_process_input\"]>;\nexport type ProcessInputResponse = JsonResponse<operations[\"post_v1_process_input\"], 200>;\nexport type ProcessListResponse = JsonResponse<operations[\"get_v1_processes\"], 200>;\nexport type ProcessLogEntry = components[\"schemas\"][\"ProcessLogEntry\"];\nexport type ProcessLogsQuery = QueryParams<operations[\"get_v1_process_logs\"]>;\nexport type ProcessLogsResponse = JsonResponse<operations[\"get_v1_process_logs\"], 200>;\nexport type ProcessLogsStream = components[\"schemas\"][\"ProcessLogsStream\"];\nexport type ProcessRunRequest = JsonRequestBody<operations[\"post_v1_processes_run\"]>;\nexport type ProcessRunResponse = JsonResponse<operations[\"post_v1_processes_run\"], 200>;\nexport type ProcessSignalQuery = QueryParams<operations[\"post_v1_process_stop\"]>;\nexport type ProcessState = components[\"schemas\"][\"ProcessState\"];\nexport type ProcessTerminalResizeRequest = JsonRequestBody<operations[\"post_v1_process_terminal_resize\"]>;\nexport type ProcessTerminalResizeResponse = JsonResponse<operations[\"post_v1_process_terminal_resize\"], 200>;\n\nexport type ProcessTerminalClientFrame =\n | {\n type: \"input\";\n data: string;\n encoding?: string;\n }\n | {\n type: \"resize\";\n cols: number;\n rows: number;\n }\n | {\n type: \"close\";\n };\n\nexport interface ProcessTerminalReadyFrame {\n type: \"ready\";\n processId: string;\n}\n\nexport interface ProcessTerminalExitFrame {\n type: \"exit\";\n exitCode?: number | null;\n}\n\nexport interface ProcessTerminalErrorFrame {\n type: \"error\";\n message: string;\n}\n\nexport type ProcessTerminalServerFrame = ProcessTerminalReadyFrame | ProcessTerminalExitFrame | ProcessTerminalErrorFrame;\n\nexport type TerminalReadyStatus = ProcessTerminalReadyFrame;\nexport type TerminalExitStatus = ProcessTerminalExitFrame;\nexport type TerminalErrorStatus = ProcessTerminalErrorFrame;\nexport type TerminalStatusMessage = ProcessTerminalServerFrame;\n\nexport interface TerminalResizePayload {\n cols: number;\n rows: number;\n}\n\nexport interface SessionRecord {\n id: string;\n agent: string;\n agentSessionId: string;\n lastConnectionId: string;\n createdAt: number;\n destroyedAt?: number;\n sessionInit?: Omit<NewSessionRequest, \"_meta\">;\n configOptions?: SessionConfigOption[];\n modes?: SessionModeState | null;\n}\n\nexport type SessionEventSender = \"client\" | \"agent\";\n\nexport interface SessionEvent {\n // Stable unique event id. For ordering, sort by (sessionId, eventIndex).\n id: string;\n eventIndex: number;\n sessionId: string;\n createdAt: number;\n connectionId: string;\n sender: SessionEventSender;\n payload: AnyMessage;\n}\n\nexport interface ListPageRequest {\n cursor?: string;\n limit?: number;\n}\n\nexport interface ListPage<T> {\n items: T[];\n nextCursor?: string;\n}\n\nexport interface ListEventsRequest extends ListPageRequest {\n sessionId: string;\n}\n\nexport interface SessionPersistDriver {\n getSession(id: string): Promise<SessionRecord | null>;\n listSessions(request?: ListPageRequest): Promise<ListPage<SessionRecord>>;\n updateSession(session: SessionRecord): Promise<void>;\n listEvents(request: ListEventsRequest): Promise<ListPage<SessionEvent>>;\n insertEvent(event: SessionEvent): Promise<void>;\n}\n\nexport interface InMemorySessionPersistDriverOptions {\n maxSessions?: number;\n maxEventsPerSession?: number;\n}\n\nconst DEFAULT_MAX_SESSIONS = 1024;\nconst DEFAULT_MAX_EVENTS_PER_SESSION = 500;\nconst DEFAULT_LIST_LIMIT = 100;\n\nexport class InMemorySessionPersistDriver implements SessionPersistDriver {\n private readonly maxSessions: number;\n private readonly maxEventsPerSession: number;\n private readonly sessions = new Map<string, SessionRecord>();\n private readonly eventsBySession = new Map<string, SessionEvent[]>();\n\n constructor(options: InMemorySessionPersistDriverOptions = {}) {\n this.maxSessions = normalizeCap(options.maxSessions, DEFAULT_MAX_SESSIONS);\n this.maxEventsPerSession = normalizeCap(options.maxEventsPerSession, DEFAULT_MAX_EVENTS_PER_SESSION);\n }\n\n async getSession(id: string): Promise<SessionRecord | null> {\n const session = this.sessions.get(id);\n return session ? cloneSessionRecord(session) : null;\n }\n\n async listSessions(request: ListPageRequest = {}): Promise<ListPage<SessionRecord>> {\n const sorted = [...this.sessions.values()].sort((a, b) => {\n if (a.createdAt !== b.createdAt) {\n return a.createdAt - b.createdAt;\n }\n return a.id.localeCompare(b.id);\n });\n const page = paginate(sorted, request);\n return {\n items: page.items.map(cloneSessionRecord),\n nextCursor: page.nextCursor,\n };\n }\n\n async updateSession(session: SessionRecord): Promise<void> {\n this.sessions.set(session.id, { ...session });\n\n if (!this.eventsBySession.has(session.id)) {\n this.eventsBySession.set(session.id, []);\n }\n\n if (this.sessions.size <= this.maxSessions) {\n return;\n }\n\n const overflow = this.sessions.size - this.maxSessions;\n const removable = [...this.sessions.values()]\n .sort((a, b) => {\n if (a.createdAt !== b.createdAt) {\n return a.createdAt - b.createdAt;\n }\n return a.id.localeCompare(b.id);\n })\n .slice(0, overflow)\n .map((sessionToRemove) => sessionToRemove.id);\n\n for (const sessionId of removable) {\n this.sessions.delete(sessionId);\n this.eventsBySession.delete(sessionId);\n }\n }\n\n async listEvents(request: ListEventsRequest): Promise<ListPage<SessionEvent>> {\n const all = [...(this.eventsBySession.get(request.sessionId) ?? [])].sort((a, b) => {\n if (a.eventIndex !== b.eventIndex) {\n return a.eventIndex - b.eventIndex;\n }\n return a.id.localeCompare(b.id);\n });\n const page = paginate(all, request);\n return {\n items: page.items.map(cloneSessionEvent),\n nextCursor: page.nextCursor,\n };\n }\n\n async insertEvent(event: SessionEvent): Promise<void> {\n const events = this.eventsBySession.get(event.sessionId) ?? [];\n events.push(cloneSessionEvent(event));\n\n if (events.length > this.maxEventsPerSession) {\n events.splice(0, events.length - this.maxEventsPerSession);\n }\n\n this.eventsBySession.set(event.sessionId, events);\n }\n}\n\nfunction cloneSessionRecord(session: SessionRecord): SessionRecord {\n return {\n ...session,\n sessionInit: session.sessionInit ? (JSON.parse(JSON.stringify(session.sessionInit)) as SessionRecord[\"sessionInit\"]) : undefined,\n configOptions: session.configOptions ? (JSON.parse(JSON.stringify(session.configOptions)) as SessionRecord[\"configOptions\"]) : undefined,\n modes: session.modes ? (JSON.parse(JSON.stringify(session.modes)) as SessionRecord[\"modes\"]) : session.modes,\n };\n}\n\nfunction cloneSessionEvent(event: SessionEvent): SessionEvent {\n return {\n ...event,\n payload: JSON.parse(JSON.stringify(event.payload)) as AnyMessage,\n };\n}\n\ntype ResponsesOf<T> = T extends { responses: infer R } ? R : never;\ntype JsonResponse<T, StatusCode extends keyof ResponsesOf<T>> = ResponsesOf<T>[StatusCode] extends {\n content: { \"application/json\": infer B };\n}\n ? B\n : never;\n\ntype JsonRequestBody<T> = T extends {\n requestBody: { content: { \"application/json\": infer B } };\n}\n ? B\n : never;\n\ntype QueryParams<T> = T extends { parameters: { query: infer Q } } ? Q : T extends { parameters: { query?: infer Q } } ? Q : never;\n\nfunction normalizeCap(value: number | undefined, fallback: number): number {\n if (!Number.isFinite(value) || (value ?? 0) < 1) {\n return fallback;\n }\n return Math.floor(value as number);\n}\n\nfunction paginate<T>(items: T[], request: ListPageRequest): ListPage<T> {\n const offset = parseCursor(request.cursor);\n const limit = normalizeCap(request.limit, DEFAULT_LIST_LIMIT);\n const slice = items.slice(offset, offset + limit);\n const nextOffset = offset + slice.length;\n return {\n items: slice,\n nextCursor: nextOffset < items.length ? String(nextOffset) : undefined,\n };\n}\n\nfunction parseCursor(cursor: string | undefined): number {\n if (!cursor) {\n return 0;\n }\n const parsed = Number.parseInt(cursor, 10);\n if (!Number.isFinite(parsed) || parsed < 0) {\n return 0;\n }\n return parsed;\n}\n","export {\n LiveAcpConnection,\n ProcessTerminalSession,\n SandboxAgent,\n SandboxAgentError,\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\";\n\nexport type {\n SandboxAgentHealthWaitOptions,\n AgentQueryOptions,\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\";\n\nexport type {\n AcpEnvelope,\n AcpServerInfo,\n AcpServerListResponse,\n AgentInfo,\n AgentQuery,\n AgentInstallRequest,\n AgentInstallResponse,\n AgentListResponse,\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 ProcessListResponse,\n ProcessLogEntry,\n ProcessLogsQuery,\n ProcessLogsResponse,\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":"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","names":["pending","AcpRpcError"]}
@@ -1,8 +1,5 @@
1
1
  // src/spawn.ts
2
- import {
3
- assertExecutable,
4
- formatNonExecutableBinaryMessage
5
- } from "@sandbox-agent/cli-shared";
2
+ import { assertExecutable, formatNonExecutableBinaryMessage } from "@sandbox-agent/cli-shared";
6
3
  var PLATFORM_PACKAGES = {
7
4
  "darwin-arm64": "@sandbox-agent/cli-darwin-arm64",
8
5
  "darwin-x64": "@sandbox-agent/cli-darwin-x64",
@@ -18,9 +15,7 @@ async function spawnSandboxAgent(options, fetcher) {
18
15
  if (!isNodeRuntime()) {
19
16
  throw new Error("Autospawn requires a Node.js runtime.");
20
17
  }
21
- const {
22
- spawn
23
- } = await import("child_process");
18
+ const { spawn } = await import("child_process");
24
19
  const crypto = await import("crypto");
25
20
  const fs = await import("fs");
26
21
  const path = await import("path");
@@ -44,17 +39,11 @@ async function spawnSandboxAgent(options, fetcher) {
44
39
  bunInstallBlocks: [
45
40
  {
46
41
  label: "Project install",
47
- commands: [
48
- `bun pm trust ${TRUST_PACKAGES}`,
49
- "bun add sandbox-agent"
50
- ]
42
+ commands: [`bun pm trust ${TRUST_PACKAGES}`, "bun add sandbox-agent"]
51
43
  },
52
44
  {
53
45
  label: "Global install",
54
- commands: [
55
- `bun pm -g trust ${TRUST_PACKAGES}`,
56
- "bun add -g sandbox-agent"
57
- ]
46
+ commands: [`bun pm -g trust ${TRUST_PACKAGES}`, "bun add -g sandbox-agent"]
58
47
  }
59
48
  ]
60
49
  })
@@ -195,4 +184,4 @@ export {
195
184
  isNodeRuntime,
196
185
  spawnSandboxAgent
197
186
  };
198
- //# sourceMappingURL=spawn-BQVVCZX7.js.map
187
+ //# sourceMappingURL=spawn-ROM6CN74.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spawn.ts"],"sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport type { AddressInfo } from \"node:net\";\nimport { assertExecutable, formatNonExecutableBinaryMessage } from \"@sandbox-agent/cli-shared\";\n\nexport type SandboxAgentSpawnLogMode = \"inherit\" | \"pipe\" | \"silent\";\n\nexport type SandboxAgentSpawnOptions = {\n enabled?: boolean;\n host?: string;\n port?: number;\n token?: string;\n binaryPath?: string;\n timeoutMs?: number;\n log?: SandboxAgentSpawnLogMode;\n env?: Record<string, string>;\n};\n\nexport type SandboxAgentSpawnHandle = {\n baseUrl: string;\n token: string;\n child: ChildProcess;\n dispose: () => Promise<void>;\n};\n\nconst PLATFORM_PACKAGES: Record<string, string> = {\n \"darwin-arm64\": \"@sandbox-agent/cli-darwin-arm64\",\n \"darwin-x64\": \"@sandbox-agent/cli-darwin-x64\",\n \"linux-x64\": \"@sandbox-agent/cli-linux-x64\",\n \"linux-arm64\": \"@sandbox-agent/cli-linux-arm64\",\n \"win32-x64\": \"@sandbox-agent/cli-win32-x64\",\n};\n\nconst TRUST_PACKAGES =\n \"@sandbox-agent/cli-linux-x64 @sandbox-agent/cli-linux-arm64 @sandbox-agent/cli-darwin-arm64 @sandbox-agent/cli-darwin-x64 @sandbox-agent/cli-win32-x64\";\n\nexport function isNodeRuntime(): boolean {\n return typeof process !== \"undefined\" && !!process.versions?.node;\n}\n\nexport async function spawnSandboxAgent(options: SandboxAgentSpawnOptions, fetcher?: typeof fetch): Promise<SandboxAgentSpawnHandle> {\n if (!isNodeRuntime()) {\n throw new Error(\"Autospawn requires a Node.js runtime.\");\n }\n\n const { spawn } = await import(\"node:child_process\");\n const crypto = await import(\"node:crypto\");\n const fs = await import(\"node:fs\");\n const path = await import(\"node:path\");\n const net = await import(\"node:net\");\n const { createRequire } = await import(\"node:module\");\n\n const bindHost = options.host ?? \"127.0.0.1\";\n const port = options.port ?? (await getFreePort(net, bindHost));\n const connectHost = bindHost === \"0.0.0.0\" || bindHost === \"::\" ? \"127.0.0.1\" : bindHost;\n const token = options.token ?? crypto.randomBytes(24).toString(\"hex\");\n const timeoutMs = options.timeoutMs ?? 15_000;\n const logMode: SandboxAgentSpawnLogMode = options.log ?? \"inherit\";\n\n const binaryPath =\n options.binaryPath ??\n resolveBinaryFromEnv(fs, path) ??\n resolveBinaryFromCliPackage(createRequire(import.meta.url), path, fs) ??\n resolveBinaryFromPath(fs, path);\n\n if (!binaryPath) {\n throw new Error(\"sandbox-agent binary not found. Install @sandbox-agent/cli or set SANDBOX_AGENT_BIN.\");\n }\n\n if (!assertExecutable(binaryPath, fs)) {\n throw new Error(\n formatNonExecutableBinaryMessage({\n binPath: binaryPath,\n trustPackages: TRUST_PACKAGES,\n bunInstallBlocks: [\n {\n label: \"Project install\",\n commands: [`bun pm trust ${TRUST_PACKAGES}`, \"bun add sandbox-agent\"],\n },\n {\n label: \"Global install\",\n commands: [`bun pm -g trust ${TRUST_PACKAGES}`, \"bun add -g sandbox-agent\"],\n },\n ],\n }),\n );\n }\n\n const stdio = logMode === \"inherit\" ? \"inherit\" : logMode === \"silent\" ? \"ignore\" : \"pipe\";\n const args = [\"server\", \"--host\", bindHost, \"--port\", String(port), \"--token\", token];\n const child = spawn(binaryPath, args, {\n stdio,\n env: {\n ...process.env,\n ...(options.env ?? {}),\n },\n });\n const cleanup = registerProcessCleanup(child);\n\n const baseUrl = `http://${connectHost}:${port}`;\n const ready = waitForHealth(baseUrl, fetcher ?? globalThis.fetch, timeoutMs, child, token);\n\n await ready;\n\n const dispose = async () => {\n if (child.exitCode !== null) {\n cleanup.dispose();\n return;\n }\n child.kill(\"SIGTERM\");\n const exited = await waitForExit(child, 5_000);\n if (!exited) {\n child.kill(\"SIGKILL\");\n }\n cleanup.dispose();\n };\n\n return { baseUrl, token, child, dispose };\n}\n\nfunction resolveBinaryFromEnv(fs: typeof import(\"node:fs\"), path: typeof import(\"node:path\")): string | null {\n const value = process.env.SANDBOX_AGENT_BIN;\n if (!value) {\n return null;\n }\n const resolved = path.resolve(value);\n if (fs.existsSync(resolved)) {\n return resolved;\n }\n return null;\n}\n\nfunction resolveBinaryFromCliPackage(\n require: ReturnType<typeof import(\"node:module\").createRequire>,\n path: typeof import(\"node:path\"),\n fs: typeof import(\"node:fs\"),\n): string | null {\n const key = `${process.platform}-${process.arch}`;\n const pkg = PLATFORM_PACKAGES[key];\n if (!pkg) {\n return null;\n }\n try {\n const pkgPath = require.resolve(`${pkg}/package.json`);\n const bin = process.platform === \"win32\" ? \"sandbox-agent.exe\" : \"sandbox-agent\";\n const resolved = path.join(path.dirname(pkgPath), \"bin\", bin);\n return fs.existsSync(resolved) ? resolved : null;\n } catch {\n return null;\n }\n}\n\nfunction resolveBinaryFromPath(fs: typeof import(\"node:fs\"), path: typeof import(\"node:path\")): string | null {\n const pathEnv = process.env.PATH ?? \"\";\n const separator = process.platform === \"win32\" ? \";\" : \":\";\n const candidates = pathEnv.split(separator).filter(Boolean);\n const bin = process.platform === \"win32\" ? \"sandbox-agent.exe\" : \"sandbox-agent\";\n for (const dir of candidates) {\n const resolved = path.join(dir, bin);\n if (fs.existsSync(resolved)) {\n return resolved;\n }\n }\n return null;\n}\n\nasync function getFreePort(net: typeof import(\"node:net\"), host: string): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.unref();\n server.on(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address() as AddressInfo;\n server.close(() => resolve(address.port));\n });\n });\n}\n\nasync function waitForHealth(baseUrl: string, fetcher: typeof fetch | undefined, timeoutMs: number, child: ChildProcess, token: string): Promise<void> {\n if (!fetcher) {\n throw new Error(\"Fetch API is not available; provide a fetch implementation.\");\n }\n const start = Date.now();\n let lastError: string | undefined;\n\n while (Date.now() - start < timeoutMs) {\n if (child.exitCode !== null) {\n throw new Error(\"sandbox-agent exited before becoming healthy.\");\n }\n try {\n const response = await fetcher(`${baseUrl}/v1/health`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (response.ok) {\n return;\n }\n lastError = `status ${response.status}`;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n throw new Error(`Timed out waiting for sandbox-agent health (${lastError ?? \"unknown error\"}).`);\n}\n\nasync function waitForExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null) {\n return true;\n }\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(false), timeoutMs);\n child.once(\"exit\", () => {\n clearTimeout(timer);\n resolve(true);\n });\n });\n}\n\nfunction registerProcessCleanup(child: ChildProcess): { dispose: () => void } {\n const handler = () => {\n if (child.exitCode === null) {\n child.kill(\"SIGTERM\");\n }\n };\n\n process.once(\"exit\", handler);\n process.once(\"SIGINT\", handler);\n process.once(\"SIGTERM\", handler);\n\n return {\n dispose: () => {\n process.off(\"exit\", handler);\n process.off(\"SIGINT\", handler);\n process.off(\"SIGTERM\", handler);\n },\n };\n}\n"],"mappings":"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","names":["require"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sandbox-agent",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Universal API for automatic coding agents in sandboxes. Supports Claude Code, Codex, OpenCode, and Amp.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -17,8 +17,8 @@
17
17
  }
18
18
  },
19
19
  "dependencies": {
20
- "@sandbox-agent/cli-shared": "0.3.1",
21
- "acp-http-client": "0.3.1"
20
+ "@sandbox-agent/cli-shared": "0.3.2",
21
+ "acp-http-client": "0.3.2"
22
22
  },
23
23
  "files": [
24
24
  "dist"
@@ -33,7 +33,7 @@
33
33
  "ws": "^8.19.0"
34
34
  },
35
35
  "optionalDependencies": {
36
- "@sandbox-agent/cli": "0.3.1"
36
+ "@sandbox-agent/cli": "0.3.2"
37
37
  },
38
38
  "scripts": {
39
39
  "generate:openapi": "SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo run -p sandbox-agent-openapi-gen -- --out ../../docs/openapi.json",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/spawn.ts"],"sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport type { AddressInfo } from \"node:net\";\nimport {\n assertExecutable,\n formatNonExecutableBinaryMessage,\n} from \"@sandbox-agent/cli-shared\";\n\nexport type SandboxAgentSpawnLogMode = \"inherit\" | \"pipe\" | \"silent\";\n\nexport type SandboxAgentSpawnOptions = {\n enabled?: boolean;\n host?: string;\n port?: number;\n token?: string;\n binaryPath?: string;\n timeoutMs?: number;\n log?: SandboxAgentSpawnLogMode;\n env?: Record<string, string>;\n};\n\nexport type SandboxAgentSpawnHandle = {\n baseUrl: string;\n token: string;\n child: ChildProcess;\n dispose: () => Promise<void>;\n};\n\nconst PLATFORM_PACKAGES: Record<string, string> = {\n \"darwin-arm64\": \"@sandbox-agent/cli-darwin-arm64\",\n \"darwin-x64\": \"@sandbox-agent/cli-darwin-x64\",\n \"linux-x64\": \"@sandbox-agent/cli-linux-x64\",\n \"linux-arm64\": \"@sandbox-agent/cli-linux-arm64\",\n \"win32-x64\": \"@sandbox-agent/cli-win32-x64\",\n};\n\nconst TRUST_PACKAGES =\n \"@sandbox-agent/cli-linux-x64 @sandbox-agent/cli-linux-arm64 @sandbox-agent/cli-darwin-arm64 @sandbox-agent/cli-darwin-x64 @sandbox-agent/cli-win32-x64\";\n\nexport function isNodeRuntime(): boolean {\n return typeof process !== \"undefined\" && !!process.versions?.node;\n}\n\nexport async function spawnSandboxAgent(\n options: SandboxAgentSpawnOptions,\n fetcher?: typeof fetch,\n): Promise<SandboxAgentSpawnHandle> {\n if (!isNodeRuntime()) {\n throw new Error(\"Autospawn requires a Node.js runtime.\");\n }\n\n const {\n spawn,\n } = await import(\"node:child_process\");\n const crypto = await import(\"node:crypto\");\n const fs = await import(\"node:fs\");\n const path = await import(\"node:path\");\n const net = await import(\"node:net\");\n const { createRequire } = await import(\"node:module\");\n\n const bindHost = options.host ?? \"127.0.0.1\";\n const port = options.port ?? (await getFreePort(net, bindHost));\n const connectHost = bindHost === \"0.0.0.0\" || bindHost === \"::\" ? \"127.0.0.1\" : bindHost;\n const token = options.token ?? crypto.randomBytes(24).toString(\"hex\");\n const timeoutMs = options.timeoutMs ?? 15_000;\n const logMode: SandboxAgentSpawnLogMode = options.log ?? \"inherit\";\n\n const binaryPath =\n options.binaryPath ??\n resolveBinaryFromEnv(fs, path) ??\n resolveBinaryFromCliPackage(createRequire(import.meta.url), path, fs) ??\n resolveBinaryFromPath(fs, path);\n\n if (!binaryPath) {\n throw new Error(\"sandbox-agent binary not found. Install @sandbox-agent/cli or set SANDBOX_AGENT_BIN.\");\n }\n\n if (!assertExecutable(binaryPath, fs)) {\n throw new Error(\n formatNonExecutableBinaryMessage({\n binPath: binaryPath,\n trustPackages: TRUST_PACKAGES,\n bunInstallBlocks: [\n {\n label: \"Project install\",\n commands: [\n `bun pm trust ${TRUST_PACKAGES}`,\n \"bun add sandbox-agent\",\n ],\n },\n {\n label: \"Global install\",\n commands: [\n `bun pm -g trust ${TRUST_PACKAGES}`,\n \"bun add -g sandbox-agent\",\n ],\n },\n ],\n }),\n );\n }\n\n const stdio = logMode === \"inherit\" ? \"inherit\" : logMode === \"silent\" ? \"ignore\" : \"pipe\";\n const args = [\"server\", \"--host\", bindHost, \"--port\", String(port), \"--token\", token];\n const child = spawn(binaryPath, args, {\n stdio,\n env: {\n ...process.env,\n ...(options.env ?? {}),\n },\n });\n const cleanup = registerProcessCleanup(child);\n\n const baseUrl = `http://${connectHost}:${port}`;\n const ready = waitForHealth(baseUrl, fetcher ?? globalThis.fetch, timeoutMs, child, token);\n\n await ready;\n\n const dispose = async () => {\n if (child.exitCode !== null) {\n cleanup.dispose();\n return;\n }\n child.kill(\"SIGTERM\");\n const exited = await waitForExit(child, 5_000);\n if (!exited) {\n child.kill(\"SIGKILL\");\n }\n cleanup.dispose();\n };\n\n return { baseUrl, token, child, dispose };\n}\n\nfunction resolveBinaryFromEnv(fs: typeof import(\"node:fs\"), path: typeof import(\"node:path\")): string | null {\n const value = process.env.SANDBOX_AGENT_BIN;\n if (!value) {\n return null;\n }\n const resolved = path.resolve(value);\n if (fs.existsSync(resolved)) {\n return resolved;\n }\n return null;\n}\n\nfunction resolveBinaryFromCliPackage(\n require: ReturnType<typeof import(\"node:module\").createRequire>,\n path: typeof import(\"node:path\"),\n fs: typeof import(\"node:fs\"),\n): string | null {\n const key = `${process.platform}-${process.arch}`;\n const pkg = PLATFORM_PACKAGES[key];\n if (!pkg) {\n return null;\n }\n try {\n const pkgPath = require.resolve(`${pkg}/package.json`);\n const bin = process.platform === \"win32\" ? \"sandbox-agent.exe\" : \"sandbox-agent\";\n const resolved = path.join(path.dirname(pkgPath), \"bin\", bin);\n return fs.existsSync(resolved) ? resolved : null;\n } catch {\n return null;\n }\n}\n\nfunction resolveBinaryFromPath(fs: typeof import(\"node:fs\"), path: typeof import(\"node:path\")): string | null {\n const pathEnv = process.env.PATH ?? \"\";\n const separator = process.platform === \"win32\" ? \";\" : \":\";\n const candidates = pathEnv.split(separator).filter(Boolean);\n const bin = process.platform === \"win32\" ? \"sandbox-agent.exe\" : \"sandbox-agent\";\n for (const dir of candidates) {\n const resolved = path.join(dir, bin);\n if (fs.existsSync(resolved)) {\n return resolved;\n }\n }\n return null;\n}\n\nasync function getFreePort(net: typeof import(\"node:net\"), host: string): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.unref();\n server.on(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address() as AddressInfo;\n server.close(() => resolve(address.port));\n });\n });\n}\n\nasync function waitForHealth(\n baseUrl: string,\n fetcher: typeof fetch | undefined,\n timeoutMs: number,\n child: ChildProcess,\n token: string,\n): Promise<void> {\n if (!fetcher) {\n throw new Error(\"Fetch API is not available; provide a fetch implementation.\");\n }\n const start = Date.now();\n let lastError: string | undefined;\n\n while (Date.now() - start < timeoutMs) {\n if (child.exitCode !== null) {\n throw new Error(\"sandbox-agent exited before becoming healthy.\");\n }\n try {\n const response = await fetcher(`${baseUrl}/v1/health`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (response.ok) {\n return;\n }\n lastError = `status ${response.status}`;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n throw new Error(`Timed out waiting for sandbox-agent health (${lastError ?? \"unknown error\"}).`);\n}\n\nasync function waitForExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null) {\n return true;\n }\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(false), timeoutMs);\n child.once(\"exit\", () => {\n clearTimeout(timer);\n resolve(true);\n });\n });\n}\n\nfunction registerProcessCleanup(child: ChildProcess): { dispose: () => void } {\n const handler = () => {\n if (child.exitCode === null) {\n child.kill(\"SIGTERM\");\n }\n };\n\n process.once(\"exit\", handler);\n process.once(\"SIGINT\", handler);\n process.once(\"SIGTERM\", handler);\n\n return {\n dispose: () => {\n process.off(\"exit\", handler);\n process.off(\"SIGINT\", handler);\n process.off(\"SIGTERM\", handler);\n },\n };\n}\n"],"mappings":"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","names":["require"]}