@tangle-network/sandbox 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1177 @@
1
+ import { $ as FleetExecDispatchOptions, A as CreateIntelligenceReportOptions, An as SandboxFleetWorkspaceReconcileResult, Bt as PromptResult, C as BatchResult, Cn as SandboxFleetToken, Dn as SandboxFleetTraceOptions, G as ExecOptions, Gt as PublicTemplateInfo, Jn as SecretsManager, Jt as PublishPublicTemplateVersionOptions, K as ExecResult, Kt as PublicTemplateVersionInfo, M as CreateSandboxFleetTokenOptions, Mn as SandboxFleetWorkspaceSnapshotResult, N as CreateSandboxFleetWithCoordinatorOptions, Nn as SandboxInfo, On as SandboxFleetUsage, P as CreateSandboxOptions, Q as FleetDispatchStreamOptions, Qt as ReconcileSandboxFleetsResult, Rt as PromptInputPart, S as BatchOptions, X as FleetDispatchResultBuffer, Xt as ReapExpiredSandboxFleetsResult, Y as FleetDispatchCancelResult, Yt as ReapExpiredSandboxFleetsOptions, Z as FleetDispatchResultBufferOptions, Zt as ReconcileSandboxFleetsOptions, _n as SandboxFleetMachineRecord, _r as UsageInfo, a as TraceExportSink, bt as ListSandboxFleetOptions, cn as SandboxFleetCostEstimate, dn as SandboxFleetDriverCapability, et as FleetExecDispatchResult, fr as TokenRefreshHandler, gt as IntelligenceReportCompareTo, ht as IntelligenceReportBudget, i as TraceExportResult, in as SandboxEnvironment, ir as SubscriptionInfo, j as CreateSandboxFleetOptions, jn as SandboxFleetWorkspaceRestoreResult, m as AttachSandboxFleetMachineOptions, mt as IntelligenceReport, n as SandboxInstance, nn as SandboxClientConfig, nr as SshKeysManager, nt as FleetPromptDispatchOptions, on as SandboxFleetArtifact, pn as SandboxFleetInfo, qt as PublishPublicTemplateOptions, rt as FleetPromptDispatchResult, sn as SandboxFleetArtifactSpec, t as HttpClient, tt as FleetMachineId, un as SandboxFleetDispatchResponse, vt as IntelligenceReportWindow, w as BatchTask, wn as SandboxFleetTraceBundle, x as BatchEvent, xn as SandboxFleetOperationsSummary, xt as ListSandboxOptions, yn as SandboxFleetManifest, zt as PromptOptions } from "./sandbox-aBpWqler.js";
2
+
3
+ //#region src/lib/sse-parser.d.ts
4
+ /**
5
+ * SSE Stream Parser
6
+ *
7
+ * EventSource stream parsing for SDK consumers. Implements the
8
+ * subset of the SSE spec (§9.2.6) that the platform actually emits —
9
+ * LF and CRLF terminators, `event:` / `data:` / `id:` fields, and
10
+ * multi-line `data:` dispatch. Used by `SandboxClient.streamBatch`
11
+ * and by the web dashboard's batch page; exported so downstream
12
+ * surfaces don't maintain their own copies.
13
+ *
14
+ * Guarantees:
15
+ * - Correctly buffers frames that straddle chunk boundaries.
16
+ * - Accepts LF- and CRLF-terminated streams interchangeably.
17
+ * - Joins multi-line `data:` per the spec (dispatch joins with
18
+ * "\n" before JSON parse).
19
+ * - Defaults event type to `"message"` when a frame carries
20
+ * `data:` but no `event:` field (SSE spec §9.2.6 step 3).
21
+ * - Surfaces optional `id:` so callers can implement reconnection.
22
+ * - Flushes a dangling event when the stream closes without a
23
+ * terminating blank line (well-behaved servers emit `\n\n`, but
24
+ * some close early).
25
+ * - Throws `AbortError` when the caller-supplied signal fires, so
26
+ * consumers can distinguish "ran to completion" from "cancelled"
27
+ * without peeking at signal state.
28
+ * - Silently drops frames with malformed JSON — the stream remains
29
+ * usable and only the individual frame is lost.
30
+ *
31
+ * What it does NOT do:
32
+ * - CR-only (legacy Mac) line terminators. No known emitter uses
33
+ * them; supporting them would risk splitting payloads that
34
+ * legitimately contain CR.
35
+ * - Retry/reconnect (caller's responsibility).
36
+ * - Event-type filtering (caller's responsibility).
37
+ */
38
+ interface ParsedSSEEvent {
39
+ /** Event type from the `event:` field, e.g. `task.completed`. */
40
+ type: string;
41
+ /** Parsed JSON payload from joined `data:` lines. */
42
+ data: Record<string, unknown>;
43
+ /** Optional `id:` field if the server emitted one. */
44
+ id?: string;
45
+ }
46
+ interface ParseSSEStreamOptions {
47
+ /**
48
+ * Signal to abort the stream. When aborted, the generator throws
49
+ * `AbortError` — this is a deliberate departure from silent-return
50
+ * semantics so the consumer's for-await loop propagates the abort
51
+ * to its own catch block instead of looking like a clean finish.
52
+ */
53
+ signal?: AbortSignal;
54
+ }
55
+ /**
56
+ * Parse a streaming SSE response body into an async iterable of
57
+ * structured events.
58
+ *
59
+ * @throws `TypeError` when the response has no body.
60
+ * @throws `DOMException` with `name === "AbortError"` on cancellation.
61
+ */
62
+ declare function parseSSEStream(body: ReadableStream<Uint8Array> | null | undefined, options?: ParseSSEStreamOptions): AsyncGenerator<ParsedSSEEvent>;
63
+ //#endregion
64
+ //#region src/fleet.d.ts
65
+ /**
66
+ * The subset of `SandboxClient` the fleet classes drive. Declared here
67
+ * rather than importing the concrete class so `fleet.ts` stays a leaf of
68
+ * `client.ts` — `client.ts` constructs `SandboxFleetClient`, so the reverse
69
+ * import would form a cycle. `SandboxClient` satisfies this structurally.
70
+ */
71
+ interface FleetClientHost {
72
+ create(options?: CreateSandboxOptions): Promise<SandboxInstance>;
73
+ list(options?: ListSandboxOptions): Promise<SandboxInstance[]>;
74
+ get(id: string): Promise<SandboxInstance | null>;
75
+ fetch(path: string, options?: RequestInit): Promise<Response>;
76
+ readonly fleets: SandboxFleetClient;
77
+ readonly intelligence: {
78
+ createReport(options: CreateIntelligenceReportOptions): Promise<IntelligenceReport>;
79
+ };
80
+ }
81
+ declare class SandboxFleet {
82
+ private readonly client;
83
+ readonly fleetId: string;
84
+ readonly machines: ReadonlyMap<FleetMachineId, SandboxInfo>;
85
+ constructor(client: FleetClientHost, fleetId: string, machines: ReadonlyMap<FleetMachineId, SandboxInfo>);
86
+ get ids(): FleetMachineId[];
87
+ get(machineId: FleetMachineId): SandboxInfo;
88
+ sandbox(machineId: FleetMachineId): Promise<SandboxInstance>;
89
+ collectArtifacts(artifacts: readonly SandboxFleetArtifactSpec[]): Promise<SandboxFleetArtifact[]>;
90
+ exec(machineId: FleetMachineId, command: string, options?: ExecOptions): Promise<ExecResult>;
91
+ dispatchExec(command: string, options?: FleetExecDispatchOptions): Promise<FleetExecDispatchResult[]>;
92
+ dispatchExecDetailed(command: string, options?: FleetExecDispatchOptions): Promise<SandboxFleetDispatchResponse<FleetExecDispatchResult>>;
93
+ prompt(machineId: FleetMachineId, message: string | PromptInputPart[], options?: PromptOptions): Promise<PromptResult>;
94
+ dispatchPrompt(message: string | PromptInputPart[], options?: FleetPromptDispatchOptions): Promise<FleetPromptDispatchResult[]>;
95
+ dispatchPromptDetailed(message: string | PromptInputPart[], options?: FleetPromptDispatchOptions): Promise<SandboxFleetDispatchResponse<FleetPromptDispatchResult>>;
96
+ manifest(): Promise<SandboxFleetManifest>;
97
+ attachMachine(machine: AttachSandboxFleetMachineOptions): Promise<SandboxFleetMachineRecord>;
98
+ detachMachine(machineId: FleetMachineId): Promise<{
99
+ success: boolean;
100
+ }>;
101
+ dispatchResults<T = FleetExecDispatchResult | FleetPromptDispatchResult>(dispatchId: string, options?: FleetDispatchResultBufferOptions): Promise<FleetDispatchResultBuffer<T>>;
102
+ cancelDispatch(dispatchId: string, reason?: string): Promise<FleetDispatchCancelResult>;
103
+ createWorkspaceSnapshot(): Promise<SandboxFleetWorkspaceSnapshotResult>;
104
+ restoreWorkspaceSnapshot(snapshotId: string): Promise<SandboxFleetWorkspaceRestoreResult>;
105
+ reconcileWorkspace(): Promise<SandboxFleetWorkspaceReconcileResult>;
106
+ dispatchExecStream(command: string, options?: FleetExecDispatchOptions & FleetDispatchStreamOptions): AsyncGenerator<ParsedSSEEvent, any, any>;
107
+ dispatchPromptStream(message: string | PromptInputPart[], options?: FleetPromptDispatchOptions & FleetDispatchStreamOptions): AsyncGenerator<ParsedSSEEvent, any, any>;
108
+ delete(options?: {
109
+ continueOnError?: boolean;
110
+ }): Promise<void>;
111
+ usage(): Promise<SandboxFleetUsage>;
112
+ trace(options?: SandboxFleetTraceOptions): Promise<SandboxFleetTraceBundle>;
113
+ intelligence(): Promise<NonNullable<SandboxFleetTraceBundle["intelligence"]>>;
114
+ createIntelligenceReport(options?: {
115
+ mode?: "deterministic" | "agentic";
116
+ acknowledgeCost?: boolean;
117
+ budget?: IntelligenceReportBudget;
118
+ metadata?: Record<string, unknown>; /** Narrow the analysis to a single dispatch within this fleet. */
119
+ dispatchId?: string; /** Bound the analysis to a time window. */
120
+ window?: IntelligenceReportWindow; /** Compare this fleet against a same-type baseline fleet. */
121
+ compareTo?: IntelligenceReportCompareTo;
122
+ }): Promise<IntelligenceReport>;
123
+ createAgenticIntelligenceReport(options: {
124
+ maxUsd: number;
125
+ metadata?: Record<string, unknown>;
126
+ dispatchId?: string;
127
+ window?: IntelligenceReportWindow;
128
+ compareTo?: IntelligenceReportCompareTo;
129
+ }): Promise<IntelligenceReport>;
130
+ exportTrace(sink: TraceExportSink): Promise<TraceExportResult>;
131
+ cost(): Promise<SandboxFleetCostEstimate>;
132
+ createToken(options?: CreateSandboxFleetTokenOptions): Promise<SandboxFleetToken>;
133
+ private requireSandbox;
134
+ }
135
+ declare class SandboxFleetClient {
136
+ private readonly client;
137
+ constructor(client: FleetClientHost);
138
+ capabilities(): Promise<{
139
+ drivers: SandboxFleetDriverCapability[];
140
+ }>;
141
+ operations(): Promise<SandboxFleetOperationsSummary>;
142
+ reconcile(options?: ReconcileSandboxFleetsOptions): Promise<ReconcileSandboxFleetsResult>;
143
+ estimateCost(options: Pick<CreateSandboxFleetOptions, "defaults" | "machines" | "policy" | "maxConcurrentCreates">): Promise<SandboxFleetCostEstimate>;
144
+ create(options: CreateSandboxFleetOptions): Promise<SandboxFleet>;
145
+ createWithCoordinator(options: CreateSandboxFleetWithCoordinatorOptions): Promise<SandboxFleet>;
146
+ private createMachine;
147
+ list(options: ListSandboxFleetOptions): Promise<SandboxFleet>;
148
+ delete(fleetId: string, options?: Omit<ListSandboxFleetOptions, "fleetId"> & {
149
+ continueOnError?: boolean;
150
+ }): Promise<void>;
151
+ fromInfo(info: SandboxFleetInfo): SandboxFleet;
152
+ private persistFleet;
153
+ private getServerFleet;
154
+ deleteRecord(fleetId: string): Promise<void>;
155
+ usage(fleetId: string): Promise<SandboxFleetUsage>;
156
+ trace(fleetId: string, options?: SandboxFleetTraceOptions): Promise<SandboxFleetTraceBundle>;
157
+ intelligence(fleetId: string): Promise<NonNullable<SandboxFleetTraceBundle["intelligence"]>>;
158
+ createIntelligenceReport(fleetId: string, options?: {
159
+ mode?: "deterministic" | "agentic";
160
+ acknowledgeCost?: boolean;
161
+ budget?: IntelligenceReportBudget;
162
+ metadata?: Record<string, unknown>;
163
+ }): Promise<IntelligenceReport>;
164
+ createAgenticIntelligenceReport(fleetId: string, options: {
165
+ maxUsd: number;
166
+ metadata?: Record<string, unknown>;
167
+ }): Promise<IntelligenceReport>;
168
+ exportTrace(fleetId: string, sink: TraceExportSink): Promise<TraceExportResult>;
169
+ cost(fleetId: string): Promise<SandboxFleetCostEstimate>;
170
+ createToken(fleetId: string, options?: CreateSandboxFleetTokenOptions): Promise<SandboxFleetToken>;
171
+ manifest(fleetId: string): Promise<SandboxFleetManifest>;
172
+ attachMachine(fleetId: string, machine: AttachSandboxFleetMachineOptions): Promise<SandboxFleetMachineRecord>;
173
+ detachMachine(fleetId: string, machineId: FleetMachineId): Promise<{
174
+ success: boolean;
175
+ }>;
176
+ dispatchResults<T = FleetExecDispatchResult | FleetPromptDispatchResult>(fleetId: string, dispatchId: string, options?: FleetDispatchResultBufferOptions): Promise<FleetDispatchResultBuffer<T>>;
177
+ cancelDispatch(fleetId: string, dispatchId: string, reason?: string): Promise<FleetDispatchCancelResult>;
178
+ createWorkspaceSnapshot(fleetId: string): Promise<SandboxFleetWorkspaceSnapshotResult>;
179
+ restoreWorkspaceSnapshot(fleetId: string, snapshotId: string): Promise<SandboxFleetWorkspaceRestoreResult>;
180
+ reconcileWorkspace(fleetId: string): Promise<SandboxFleetWorkspaceReconcileResult>;
181
+ dispatchExecStream(fleetId: string, command: string, options?: FleetExecDispatchOptions & FleetDispatchStreamOptions): AsyncGenerator<ParsedSSEEvent>;
182
+ dispatchPromptStream(fleetId: string, message: string | PromptInputPart[], options?: FleetPromptDispatchOptions & FleetDispatchStreamOptions): AsyncGenerator<ParsedSSEEvent>;
183
+ reapExpired(options?: ReapExpiredSandboxFleetsOptions): Promise<ReapExpiredSandboxFleetsResult>;
184
+ private hydrateServerFleet;
185
+ private listBySandboxMetadata;
186
+ }
187
+ //#endregion
188
+ //#region src/integrations.d.ts
189
+ type IntegrationPrincipalType = "customer" | "team";
190
+ type IntegrationProvider = "generic" | "github" | "generic_oauth2";
191
+ type IntegrationVerificationKind = "none" | "hmac_shared_secret" | "provider:github";
192
+ type IntegrationActionKind = "sandbox.create" | "sandbox.dispatch" | "sandbox.event" | "sandbox.respond_inline";
193
+ type IntegrationDeliveryStatus = "pending" | "delivered" | "failed" | "disabled";
194
+ /**
195
+ * Opaque JSON value flowing through an integration. Tied to whichever
196
+ * trigger/endpoint shape is on the wire — the SDK doesn't introspect
197
+ * it. Aliased instead of using bare `unknown` so call sites read as
198
+ * "this came from JSON" rather than "this is genuinely any type".
199
+ */
200
+ type IntegrationJsonValue = unknown;
201
+ interface IntegrationAction {
202
+ kind: IntegrationActionKind;
203
+ config: IntegrationJsonValue;
204
+ mappings?: Record<string, string>;
205
+ }
206
+ interface IntegrationScope {
207
+ sandboxIds?: string[];
208
+ sessionIds?: string[];
209
+ teamId?: string;
210
+ }
211
+ interface ConnectionInfo {
212
+ id: string;
213
+ ownerType: IntegrationPrincipalType;
214
+ ownerId: string;
215
+ provider: IntegrationProvider;
216
+ externalId: string;
217
+ displayName: string | null;
218
+ authKind: "oauth2" | "api_key" | "signing_only";
219
+ metadata: Record<string, unknown> | null;
220
+ status: "active" | "revoked" | "error";
221
+ installedAt: string;
222
+ }
223
+ interface AutomationInfo {
224
+ id: string;
225
+ ownerType: IntegrationPrincipalType;
226
+ ownerId: string;
227
+ connectionId: string | null;
228
+ name: string;
229
+ description: string | null;
230
+ recipeId: string | null;
231
+ enabled: boolean;
232
+ createdAt: string;
233
+ updatedAt: string;
234
+ }
235
+ interface EndpointInfo {
236
+ id: string;
237
+ automationId: string | null;
238
+ ownerType: IntegrationPrincipalType;
239
+ ownerId: string;
240
+ connectionId: string | null;
241
+ url: string | null;
242
+ events: string[];
243
+ scope: IntegrationScope | null;
244
+ description: string | null;
245
+ enabled: boolean;
246
+ ephemeralForSandboxId: string | null;
247
+ consecutiveFailures: number;
248
+ disabledReason: string | null;
249
+ disabledAt: string | null;
250
+ createdAt: string;
251
+ updatedAt: string;
252
+ }
253
+ interface EndpointWithSecret extends EndpointInfo {
254
+ /** Returned only at create / rotate. Save it on your end. */
255
+ secret: string;
256
+ }
257
+ interface TriggerInfo {
258
+ id: string;
259
+ automationId: string | null;
260
+ ownerType: IntegrationPrincipalType;
261
+ ownerId: string;
262
+ connectionId: string | null;
263
+ urlToken: string;
264
+ /** Public URL the third party POSTs to. */
265
+ publicUrl: string;
266
+ verificationKind: IntegrationVerificationKind;
267
+ eventFilter: Record<string, unknown> | null;
268
+ action: IntegrationAction;
269
+ rateLimitRpm: number;
270
+ allowIps: string[] | null;
271
+ description: string | null;
272
+ enabled: boolean;
273
+ ephemeralForSandboxId: string | null;
274
+ createdAt: string;
275
+ updatedAt: string;
276
+ }
277
+ interface TriggerWithSecret extends TriggerInfo {
278
+ /** Returned only at create. Null when verificationKind === "none". */
279
+ secret: string | null;
280
+ }
281
+ interface DeliveryAttempt {
282
+ id: string;
283
+ endpointId: string;
284
+ automationId: string | null;
285
+ type: string;
286
+ payload: IntegrationJsonValue;
287
+ status: IntegrationDeliveryStatus;
288
+ attempts: number;
289
+ lastAttemptAt: string | null;
290
+ nextAttemptAt: string | null;
291
+ lastResponseStatus: number | null;
292
+ lastResponseBodyExcerpt: string | null;
293
+ createdAt: string;
294
+ deliveredAt: string | null;
295
+ }
296
+ interface TriggerRun {
297
+ id: string;
298
+ triggerId: string;
299
+ automationId: string | null;
300
+ requestId: string;
301
+ requestHeaders: Record<string, string>;
302
+ requestBody: string;
303
+ requestIp: string | null;
304
+ verificationStatus: "ok" | "bad_signature" | "expired" | "filtered_out" | "rate_limited";
305
+ actionStatus: "queued" | "running" | "succeeded" | "failed" | "rate_limited" | "skipped";
306
+ actionResult: Record<string, unknown> | null;
307
+ errorMessage: string | null;
308
+ createdAt: string;
309
+ completedAt: string | null;
310
+ }
311
+ interface RecipeManifest {
312
+ id: string;
313
+ title: string;
314
+ description: string;
315
+ icon?: string;
316
+ requiresConnection?: IntegrationProvider;
317
+ userInputs?: Array<{
318
+ key: string;
319
+ label: string;
320
+ type?: "text" | "select";
321
+ default?: string;
322
+ options?: string[];
323
+ required?: boolean;
324
+ }>;
325
+ automation: {
326
+ name: string;
327
+ description?: string;
328
+ };
329
+ }
330
+ interface CreateAutomationInput {
331
+ teamId?: string;
332
+ name: string;
333
+ description?: string;
334
+ connectionId?: string;
335
+ recipeId?: string;
336
+ enabled?: boolean;
337
+ triggers?: Array<{
338
+ verificationKind: IntegrationVerificationKind;
339
+ connectionId?: string;
340
+ eventFilter?: Record<string, unknown>;
341
+ action: IntegrationAction;
342
+ rateLimitRpm?: number;
343
+ allowIps?: string[];
344
+ description?: string;
345
+ }>;
346
+ endpoints?: Array<{
347
+ url?: string;
348
+ connectionId?: string;
349
+ events: string[];
350
+ scope?: IntegrationScope;
351
+ description?: string;
352
+ }>;
353
+ }
354
+ interface CreateEndpointInput {
355
+ teamId?: string;
356
+ automationId?: string;
357
+ connectionId?: string;
358
+ url?: string;
359
+ events: string[];
360
+ scope?: IntegrationScope;
361
+ description?: string;
362
+ }
363
+ interface CreateTriggerInput {
364
+ teamId?: string;
365
+ automationId?: string;
366
+ connectionId?: string;
367
+ verificationKind: IntegrationVerificationKind;
368
+ eventFilter?: Record<string, unknown>;
369
+ action: IntegrationAction;
370
+ rateLimitRpm?: number;
371
+ allowIps?: string[];
372
+ description?: string;
373
+ }
374
+ interface InstallRecipeInput {
375
+ teamId?: string;
376
+ connectionId?: string;
377
+ inputs?: Record<string, string>;
378
+ }
379
+ declare class IntegrationsManager {
380
+ private readonly client;
381
+ constructor(client: HttpClient);
382
+ readonly automations: {
383
+ list: (opts?: {
384
+ teamId?: string;
385
+ }) => Promise<AutomationInfo[]>;
386
+ get: (id: string, opts?: {
387
+ teamId?: string;
388
+ }) => Promise<{
389
+ automation: AutomationInfo;
390
+ triggers: TriggerInfo[];
391
+ endpoints: EndpointInfo[];
392
+ }>;
393
+ create: (input: CreateAutomationInput) => Promise<{
394
+ automation: AutomationInfo;
395
+ triggers: TriggerInfo[];
396
+ endpoints: EndpointInfo[];
397
+ }>;
398
+ update: (id: string, patch: {
399
+ teamId?: string;
400
+ name?: string;
401
+ description?: string;
402
+ enabled?: boolean;
403
+ connectionId?: string | null;
404
+ }) => Promise<AutomationInfo>;
405
+ delete: (id: string, opts?: {
406
+ teamId?: string;
407
+ }) => Promise<void>;
408
+ /**
409
+ * Unified inbound + outbound timeline for an automation.
410
+ * Returns the most recent N rows (default 100). Pagination is
411
+ * by `since` ISO8601 timestamp.
412
+ */
413
+ logs: (id: string, opts?: {
414
+ teamId?: string;
415
+ since?: string;
416
+ limit?: number;
417
+ }) => Promise<{
418
+ deliveries: DeliveryAttempt[];
419
+ runs: TriggerRun[];
420
+ }>;
421
+ /**
422
+ * Install an automation from a recipe manifest. The recipe defines
423
+ * what gets created (one Automation, plus underlying triggers /
424
+ * endpoints) and which inputs the user must supply.
425
+ */
426
+ installFromRecipe: (recipeId: string, input?: InstallRecipeInput) => Promise<{
427
+ automation: AutomationInfo;
428
+ triggers: TriggerInfo[];
429
+ endpoints: EndpointInfo[];
430
+ }>;
431
+ };
432
+ /**
433
+ * Iterate all log entries for an automation, paging through
434
+ * deliveries+runs in 200-row batches. Use this to power export
435
+ * scripts or dashboards. Defined on the manager (not under
436
+ * .automations) because async generators can't reference an
437
+ * enclosing object literal's other methods through `this` cleanly.
438
+ */
439
+ iterateAutomationLogs(id: string, opts?: {
440
+ teamId?: string;
441
+ since?: string;
442
+ }): AsyncGenerator<{
443
+ deliveries: DeliveryAttempt[];
444
+ runs: TriggerRun[];
445
+ }>;
446
+ readonly recipes: {
447
+ list: () => Promise<RecipeManifest[]>;
448
+ get: (id: string) => Promise<RecipeManifest>;
449
+ };
450
+ readonly connections: {
451
+ list: (opts?: {
452
+ teamId?: string;
453
+ }) => Promise<ConnectionInfo[]>;
454
+ delete: (id: string, opts?: {
455
+ teamId?: string;
456
+ }) => Promise<void>;
457
+ };
458
+ readonly endpoints: {
459
+ list: (opts?: {
460
+ teamId?: string;
461
+ }) => Promise<EndpointInfo[]>;
462
+ create: (input: CreateEndpointInput) => Promise<EndpointWithSecret>;
463
+ update: (id: string, patch: {
464
+ teamId?: string;
465
+ url?: string;
466
+ events?: string[];
467
+ scope?: IntegrationScope;
468
+ description?: string;
469
+ enabled?: boolean;
470
+ }) => Promise<EndpointInfo>;
471
+ delete: (id: string, opts?: {
472
+ teamId?: string;
473
+ }) => Promise<void>;
474
+ rotateSecret: (id: string, opts?: {
475
+ teamId?: string;
476
+ }) => Promise<EndpointWithSecret>;
477
+ listDeliveries: (id: string, opts?: {
478
+ teamId?: string;
479
+ since?: string;
480
+ status?: IntegrationDeliveryStatus;
481
+ limit?: number;
482
+ }) => Promise<DeliveryAttempt[]>;
483
+ };
484
+ readonly triggers: {
485
+ list: (opts?: {
486
+ teamId?: string;
487
+ }) => Promise<TriggerInfo[]>;
488
+ create: (input: CreateTriggerInput) => Promise<TriggerWithSecret>;
489
+ update: (id: string, patch: {
490
+ teamId?: string;
491
+ eventFilter?: Record<string, unknown> | null;
492
+ action?: IntegrationAction;
493
+ rateLimitRpm?: number;
494
+ allowIps?: string[] | null;
495
+ description?: string;
496
+ enabled?: boolean;
497
+ }) => Promise<TriggerInfo>;
498
+ delete: (id: string, opts?: {
499
+ teamId?: string;
500
+ }) => Promise<void>;
501
+ listRuns: (id: string, opts?: {
502
+ teamId?: string;
503
+ since?: string;
504
+ limit?: number;
505
+ }) => Promise<TriggerRun[]>;
506
+ };
507
+ }
508
+ //#endregion
509
+ //#region src/client.d.ts
510
+ /**
511
+ * Client for the Tangle Sandbox platform.
512
+ *
513
+ * @example
514
+ * ```typescript
515
+ * import { Sandbox } from "@tangle-network/sandbox";
516
+ *
517
+ * const client = new Sandbox({
518
+ * apiKey: "sk_sandbox_...",
519
+ * baseUrl: "https://your-sandbox-api.example.com",
520
+ * });
521
+ *
522
+ * // Create a sandbox
523
+ * const box = await client.create({
524
+ * name: "my-project",
525
+ * sshEnabled: true,
526
+ * });
527
+ *
528
+ * // Execute commands
529
+ * const result = await box.exec("npm install");
530
+ *
531
+ * // Clean up
532
+ * await box.delete();
533
+ * ```
534
+ */
535
+ declare class SandboxClient implements HttpClient {
536
+ private readonly baseUrl;
537
+ private readonly apiKey;
538
+ private readonly timeoutMs;
539
+ private readonly trustLocalCliAuth;
540
+ private _secrets;
541
+ private _sshKeys;
542
+ private _integrations;
543
+ private _fleets;
544
+ private _intelligence;
545
+ constructor(config: SandboxClientConfig);
546
+ /**
547
+ * Fleet operations for agent-managed groups of sandboxes.
548
+ *
549
+ * Fleets are an SDK-level convenience over the existing sandbox lifecycle
550
+ * API. Each worker is a normal sandbox tagged with stable fleet metadata,
551
+ * so older clients and dashboards can still inspect and delete them.
552
+ */
553
+ get fleets(): SandboxFleetClient;
554
+ get intelligence(): IntelligenceClient;
555
+ getApiKey(): string;
556
+ /**
557
+ * Access the secrets manager for storing and retrieving encrypted secrets.
558
+ *
559
+ * @example
560
+ * ```typescript
561
+ * // Create a secret
562
+ * await client.secrets.create("HF_TOKEN", "hf_xxx");
563
+ *
564
+ * // List secrets (names only)
565
+ * const secrets = await client.secrets.list();
566
+ *
567
+ * // Get secret value
568
+ * const value = await client.secrets.get("HF_TOKEN");
569
+ *
570
+ * // Update secret
571
+ * await client.secrets.update("HF_TOKEN", "hf_new_value");
572
+ *
573
+ * // Delete secret
574
+ * await client.secrets.delete("HF_TOKEN");
575
+ * ```
576
+ */
577
+ get secrets(): SecretsManager;
578
+ get sshKeys(): SshKeysManager;
579
+ /**
580
+ * Access the integrations manager — webhooks (inbound + outbound),
581
+ * automations, connections to managed connectors, and recipes.
582
+ *
583
+ * Spec: specs/sandbox-integrations.md.
584
+ *
585
+ * @example
586
+ * ```typescript
587
+ * // Outbound: get pinged when a sandbox fails
588
+ * const ep = await client.integrations.endpoints.create({
589
+ * url: "https://example.com/hook",
590
+ * events: ["sandbox.failed", "sandbox.permanently_dead"],
591
+ * });
592
+ * console.log(ep.secret); // shown once — store it
593
+ *
594
+ * // Inbound: a public URL that, when POSTed to, runs an action
595
+ * const trg = await client.integrations.triggers.create({
596
+ * verificationKind: "hmac_shared_secret",
597
+ * action: {
598
+ * kind: "sandbox.create",
599
+ * config: { template: "node-22", prompt: "Run: ${body.prompt}" },
600
+ * },
601
+ * });
602
+ * console.log(trg.publicUrl);
603
+ *
604
+ * // One-click recipe install
605
+ * const auto = await client.integrations.automations.installFromRecipe(
606
+ * "github.pr-review",
607
+ * { connectionId: "ic_…", inputs: { template: "node-22" } },
608
+ * );
609
+ * ```
610
+ */
611
+ get integrations(): IntegrationsManager;
612
+ private _environments;
613
+ /**
614
+ * Access available development environments.
615
+ *
616
+ * @example
617
+ * ```typescript
618
+ * const envs = await client.environments.list();
619
+ * // → [{ id: "universal", description: "Universal environment with all toolchains via Nix", ... }]
620
+ *
621
+ * const sandbox = await client.create({ environment: "universal" });
622
+ * ```
623
+ */
624
+ get environments(): EnvironmentsClient;
625
+ private _teams;
626
+ private _publicTemplates;
627
+ /**
628
+ * Access team management (collaboration groups, invitations,
629
+ * member roles). Teams scope shared sandboxes — pass `teamId` to
630
+ * `client.create()` to create a sandbox accessible to a team's
631
+ * members.
632
+ *
633
+ * @example
634
+ * ```typescript
635
+ * const teams = await client.teams.list();
636
+ * const invite = await client.teams.invite(teams[0].id, {
637
+ * email: "alice@example.com",
638
+ * role: "member",
639
+ * });
640
+ * ```
641
+ */
642
+ get teams(): TeamsClient;
643
+ get publicTemplates(): PublicTemplatesClient;
644
+ /**
645
+ * Create a new sandbox.
646
+ *
647
+ * @param options - Configuration for the new sandbox
648
+ * @returns A SandboxInstance representing the created sandbox
649
+ *
650
+ * @example
651
+ * ```typescript
652
+ * const box = await client.create({
653
+ * name: "my-project",
654
+ * environment: "universal",
655
+ * sshEnabled: true,
656
+ * env: { NODE_ENV: "development" },
657
+ * });
658
+ * ```
659
+ */
660
+ create(options?: CreateSandboxOptions): Promise<SandboxInstance>;
661
+ /**
662
+ * List all sandboxes.
663
+ *
664
+ * @param options - Filtering and pagination options
665
+ * @returns Array of SandboxInstance objects
666
+ *
667
+ * @example
668
+ * ```typescript
669
+ * // List all running sandboxes
670
+ * const running = await client.list({ status: "running" });
671
+ *
672
+ * // List with pagination
673
+ * const page = await client.list({ limit: 10, offset: 0 });
674
+ * ```
675
+ */
676
+ list(options?: ListSandboxOptions): Promise<SandboxInstance[]>;
677
+ /**
678
+ * Get a sandbox by ID.
679
+ *
680
+ * @param id - The sandbox ID
681
+ * @returns A SandboxInstance or null if not found
682
+ *
683
+ * @example
684
+ * ```typescript
685
+ * const box = await client.get("sandbox_abc123");
686
+ * if (box) {
687
+ * console.log(box.status);
688
+ * }
689
+ * ```
690
+ */
691
+ get(id: string): Promise<SandboxInstance | null>;
692
+ /**
693
+ * Get usage information for the account.
694
+ *
695
+ * @returns Usage statistics for the current billing period
696
+ *
697
+ * @example
698
+ * ```typescript
699
+ * const usage = await client.usage();
700
+ * console.log(`Active sandboxes: ${usage.activeSandboxes}`);
701
+ * console.log(`Compute minutes: ${usage.computeMinutes}`);
702
+ * ```
703
+ */
704
+ usage(): Promise<UsageInfo>;
705
+ /**
706
+ * Get subscription and billing information for the account.
707
+ *
708
+ * @returns Subscription details including plan, credits, and limits
709
+ *
710
+ * @example
711
+ * ```typescript
712
+ * const sub = await client.subscription();
713
+ * console.log(`Plan: ${sub.plan}`);
714
+ * console.log(`Credits: $${sub.creditsAvailableUsd.toFixed(2)}`);
715
+ * ```
716
+ */
717
+ subscription(): Promise<SubscriptionInfo>;
718
+ /**
719
+ * Check if the Sandbox API is available.
720
+ *
721
+ * @returns true if the API is healthy, false otherwise
722
+ */
723
+ health(): Promise<boolean>;
724
+ /**
725
+ * Check if CRIU checkpointing is available on the platform.
726
+ *
727
+ * CRIU enables memory preservation for true pause/resume and fork operations.
728
+ * It requires specific host configuration.
729
+ *
730
+ * @returns CRIU availability status
731
+ *
732
+ * @example
733
+ * ```typescript
734
+ * const status = await client.criuStatus();
735
+ * if (status.available) {
736
+ * console.log(`CRIU ${status.criuVersion} available`);
737
+ * } else {
738
+ * console.log(`CRIU not available: ${status.reason}`);
739
+ * }
740
+ * ```
741
+ */
742
+ criuStatus(): Promise<{
743
+ available: boolean;
744
+ criuVersion?: string;
745
+ reason?: string;
746
+ requirements?: {
747
+ kernel: boolean;
748
+ criu: boolean;
749
+ storageDriver: boolean;
750
+ experimental: boolean;
751
+ };
752
+ }>;
753
+ /**
754
+ * Run multiple tasks in parallel across sandboxes.
755
+ * Returns the aggregated results after all tasks complete.
756
+ *
757
+ * @param tasks - Array of tasks to execute
758
+ * @param options - Batch execution options
759
+ * @returns Aggregated batch results
760
+ *
761
+ * @throws {@link TimeoutError} if the server hasn't begun responding
762
+ * before the deadline (pre-stream timeout).
763
+ * @throws {@link ValidationError} / {@link QuotaError} / other typed
764
+ * SDK errors if the server rejects the request before streaming.
765
+ * @throws `DOMException` with `name === "AbortError"` if
766
+ * `options.signal` fires OR the safety-valve deadline fires
767
+ * AFTER streaming has begun — parseSSEStream can't distinguish
768
+ * the source mid-stream. Callers that need to tell cancel from
769
+ * timeout should check `options.signal?.aborted` in their catch.
770
+ * @throws `Error` with the server message if the stream emits a
771
+ * `batch.failed` event.
772
+ *
773
+ * @example
774
+ * ```typescript
775
+ * const result = await client.runBatch([
776
+ * { id: "task-1", message: "Analyze this file" },
777
+ * { id: "task-2", message: "Generate a summary" },
778
+ * ]);
779
+ * console.log(`Success rate: ${result.successRate}%`);
780
+ * ```
781
+ */
782
+ runBatch(tasks: BatchTask[], options?: BatchOptions): Promise<BatchResult>;
783
+ /**
784
+ * Stream events from a batch execution.
785
+ * Use this for real-time progress updates during batch processing.
786
+ *
787
+ * @param tasks - Array of tasks to execute
788
+ * @param options - Batch execution options
789
+ *
790
+ * @throws {@link TimeoutError} if the server hasn't begun responding
791
+ * before the deadline (pre-stream timeout).
792
+ * @throws {@link ValidationError} / {@link QuotaError} / other typed
793
+ * SDK errors if the server rejects the request before streaming.
794
+ * @throws `DOMException` with `name === "AbortError"` if
795
+ * `options.signal` fires OR the safety-valve deadline fires
796
+ * AFTER streaming has begun. Distinguish via
797
+ * `options.signal?.aborted` in the consumer's catch.
798
+ *
799
+ * @example
800
+ * ```typescript
801
+ * for await (const event of client.streamBatch(tasks)) {
802
+ * if (event.type === "task.completed") {
803
+ * console.log(`Task ${event.data.taskId} completed`);
804
+ * }
805
+ * }
806
+ * ```
807
+ */
808
+ streamBatch(tasks: BatchTask[], options?: BatchOptions): AsyncGenerator<BatchEvent>;
809
+ /**
810
+ * Make an authenticated HTTP request to the API.
811
+ * This is exposed for use by SandboxInstance.
812
+ */
813
+ fetch(path: string, options?: RequestInit): Promise<Response>;
814
+ private parseInfo;
815
+ private readonly _tokenRefreshHandlers;
816
+ /**
817
+ * Register a handler invoked when the SDK transparently refreshes a
818
+ * sandbox bearer after a 401 retry. Returns a function that
819
+ * unregisters the handler when called.
820
+ */
821
+ onTokenRefresh(handler: TokenRefreshHandler): () => void;
822
+ /** @internal — fired by the runtime-fetch retry path after a successful
823
+ * refresh. Errors thrown by handlers are caught and surfaced as
824
+ * console warnings so one bad subscriber does not poison the rest. */
825
+ _emitTokenRefresh(sandboxId: string, newToken: string): void;
826
+ }
827
+ /**
828
+ * Client for the Intelligence Reports API.
829
+ *
830
+ * Two analysis modes:
831
+ *
832
+ * - `deterministic` (default): free, rule-based platform analysis over
833
+ * the subject's trace evidence. Returns immediately.
834
+ * - `agentic`: routes to the **Tangle Trace Analyst**, an LLM-driven
835
+ * reasoning loop that reads OTLP-shaped trace evidence and emits
836
+ * findings, evidence references, recommended actions, and a
837
+ * validation plan. Billed against `budget.maxUsd`; the platform
838
+ * never spends past the budget the caller sets.
839
+ *
840
+ * Subjects: `sandbox` or `fleet`. A fleet subject can be narrowed to
841
+ * a single coordinated command via `subject.dispatchId`.
842
+ */
843
+ declare class IntelligenceClient {
844
+ private readonly client;
845
+ constructor(client: SandboxClient);
846
+ /**
847
+ * Create an intelligence report over the given subject.
848
+ *
849
+ * Use `mode: "agentic"` to engage the **Tangle Trace Analyst** with a
850
+ * spending budget. The budget is enforced server-side before billing
851
+ * fires — a request whose computed cost exceeds `budget.maxUsd`
852
+ * returns 402 without charging the customer.
853
+ */
854
+ createReport(options: CreateIntelligenceReportOptions): Promise<IntelligenceReport>;
855
+ createAgenticReport(options: {
856
+ subject: CreateIntelligenceReportOptions["subject"];
857
+ maxUsd: number;
858
+ metadata?: Record<string, unknown>;
859
+ }): Promise<IntelligenceReport>;
860
+ /**
861
+ * Estimate the cost of a prospective report without creating one.
862
+ * Verifies subject ownership the same way `createReport` does, so it
863
+ * never becomes an existence oracle for foreign subjects.
864
+ */
865
+ estimateReport(options: Pick<CreateIntelligenceReportOptions, "subject"> & {
866
+ mode?: "deterministic" | "agentic";
867
+ metadata?: Record<string, unknown>;
868
+ }): Promise<{
869
+ mode: "deterministic" | "agentic";
870
+ costUsd: number;
871
+ billable: boolean;
872
+ billedTo: "platform" | "customer";
873
+ reason: string;
874
+ }>;
875
+ getReport(jobId: string): Promise<IntelligenceReport>;
876
+ listReports(options?: {
877
+ subjectType?: CreateIntelligenceReportOptions["subject"]["type"];
878
+ subjectId?: string;
879
+ limit?: number;
880
+ }): Promise<IntelligenceReport[]>;
881
+ waitForReport(jobId: string, options?: {
882
+ timeoutMs?: number;
883
+ pollMs?: number;
884
+ }): Promise<IntelligenceReport>;
885
+ }
886
+ /**
887
+ * Client for browsing available development environments.
888
+ */
889
+ declare class EnvironmentsClient {
890
+ private readonly client;
891
+ constructor(client: SandboxClient);
892
+ /**
893
+ * List available development environments.
894
+ *
895
+ * @returns Array of available environments with metadata
896
+ *
897
+ * @example
898
+ * ```typescript
899
+ * const envs = await client.environments.list();
900
+ * for (const env of envs) {
901
+ * console.log(`${env.id}: ${env.description}`);
902
+ * }
903
+ * ```
904
+ */
905
+ list(): Promise<SandboxEnvironment[]>;
906
+ /**
907
+ * Get details for a specific environment.
908
+ *
909
+ * @param id - Environment identifier (e.g., "universal")
910
+ */
911
+ get(id: string): Promise<SandboxEnvironment | null>;
912
+ }
913
+ declare class PublicTemplatesClient {
914
+ private readonly client;
915
+ constructor(client: SandboxClient);
916
+ list(options?: {
917
+ query?: string;
918
+ tag?: string;
919
+ featuredOnly?: boolean;
920
+ limit?: number;
921
+ offset?: number;
922
+ }): Promise<PublicTemplateInfo[]>;
923
+ featured(): Promise<PublicTemplateInfo[]>;
924
+ get(idOrSlug: string): Promise<PublicTemplateInfo>;
925
+ versions(idOrSlug: string): Promise<PublicTemplateVersionInfo[]>;
926
+ publish(options: PublishPublicTemplateOptions): Promise<PublicTemplateInfo>;
927
+ publishVersion(idOrSlug: string, options: PublishPublicTemplateVersionOptions): Promise<PublicTemplateVersionInfo>;
928
+ }
929
+ /**
930
+ * Team (collaboration group) record as returned from the API.
931
+ */
932
+ interface Team {
933
+ id: string;
934
+ name: string;
935
+ ownerCustomerId: string;
936
+ orgId: string | null;
937
+ memberCount: number;
938
+ currentUserRole: "owner" | "admin" | "member" | "viewer";
939
+ createdAt: string;
940
+ updatedAt: string;
941
+ }
942
+ interface TeamMember {
943
+ id: string;
944
+ teamId: string;
945
+ customerId: string;
946
+ customerEmail: string;
947
+ customerName: string | null;
948
+ role: "owner" | "admin" | "member" | "viewer";
949
+ status: "active" | "pending" | "removed";
950
+ joinedAt: string | null;
951
+ createdAt: string;
952
+ }
953
+ interface TeamInvitation {
954
+ id: string;
955
+ teamId: string;
956
+ email: string;
957
+ invitedBy: string;
958
+ invitedByEmail: string | null;
959
+ role: "admin" | "member" | "viewer";
960
+ token: string;
961
+ status: "pending" | "accepted" | "expired" | "revoked";
962
+ expiresAt: string;
963
+ createdAt: string;
964
+ }
965
+ interface TeamInvitationPreview {
966
+ email: string;
967
+ role: "admin" | "member" | "viewer";
968
+ status: "pending" | "accepted" | "expired" | "revoked";
969
+ expiresAt: string;
970
+ teamName: string;
971
+ invitedByEmail: string | null;
972
+ }
973
+ interface TeamSecretRecord {
974
+ name: string;
975
+ updatedAt: string;
976
+ updatedBy: string;
977
+ }
978
+ interface TeamTemplateRecord {
979
+ id: string;
980
+ name: string;
981
+ description: string;
982
+ snapshotId: string;
983
+ environment: string;
984
+ config: Record<string, unknown>;
985
+ teamId: string | null;
986
+ createdAt: string;
987
+ updatedAt: string;
988
+ }
989
+ interface CreateTeamTemplateOptions {
990
+ name: string;
991
+ snapshotId: string;
992
+ description?: string;
993
+ environment?: string;
994
+ config?: Record<string, unknown>;
995
+ }
996
+ interface CreateTeamOptions {
997
+ name: string;
998
+ orgId?: string;
999
+ }
1000
+ interface InviteTeamMemberOptions {
1001
+ email: string;
1002
+ role: "admin" | "member" | "viewer";
1003
+ /** Lifetime of the invitation in hours (default 168 = 7 days). */
1004
+ ttlHours?: number;
1005
+ }
1006
+ /**
1007
+ * Client for managing teams and team-scoped sharing.
1008
+ *
1009
+ * Team resources are scoped to the authenticated user's membership —
1010
+ * the client never needs to pass an org id explicitly.
1011
+ */
1012
+ declare class TeamsClient {
1013
+ private readonly client;
1014
+ constructor(client: SandboxClient);
1015
+ list(): Promise<Team[]>;
1016
+ create(options: CreateTeamOptions): Promise<Team>;
1017
+ get(teamId: string): Promise<Team>;
1018
+ update(teamId: string, updates: {
1019
+ name?: string;
1020
+ }): Promise<Team>;
1021
+ delete(teamId: string): Promise<void>;
1022
+ leave(teamId: string): Promise<void>;
1023
+ transferOwnership(teamId: string, newOwnerCustomerId: string): Promise<void>;
1024
+ listMembers(teamId: string): Promise<TeamMember[]>;
1025
+ updateMember(teamId: string, memberId: string, updates: {
1026
+ role?: "admin" | "member" | "viewer";
1027
+ status?: "active" | "removed";
1028
+ }): Promise<TeamMember>;
1029
+ removeMember(teamId: string, memberId: string): Promise<void>;
1030
+ listInvitations(teamId: string): Promise<TeamInvitation[]>;
1031
+ invite(teamId: string, options: InviteTeamMemberOptions): Promise<TeamInvitation>;
1032
+ revokeInvitation(invitationId: string): Promise<void>;
1033
+ acceptInvitation(token: string): Promise<TeamMember>;
1034
+ getInvitation(token: string): Promise<TeamInvitationPreview>;
1035
+ listSecrets(teamId: string): Promise<TeamSecretRecord[]>;
1036
+ upsertSecret(teamId: string, name: string, value: string): Promise<TeamSecretRecord>;
1037
+ deleteSecret(teamId: string, name: string): Promise<void>;
1038
+ revealSecret(teamId: string, name: string): Promise<{
1039
+ name: string;
1040
+ value: string;
1041
+ }>;
1042
+ listTemplates(teamId: string): Promise<TeamTemplateRecord[]>;
1043
+ createTemplate(teamId: string, options: CreateTeamTemplateOptions): Promise<TeamTemplateRecord>;
1044
+ deleteTemplate(teamId: string, templateId: string): Promise<void>;
1045
+ }
1046
+ /**
1047
+ * Alias for SandboxClient for cleaner imports.
1048
+ */
1049
+ //#endregion
1050
+ //#region src/errors.d.ts
1051
+ /**
1052
+ * Sandbox SDK Errors
1053
+ *
1054
+ * Error classes for the Sandbox client SDK.
1055
+ */
1056
+ /**
1057
+ * Base error class for all Sandbox SDK errors.
1058
+ */
1059
+ declare class SandboxError extends Error {
1060
+ /** HTTP status code if applicable */
1061
+ readonly status?: number;
1062
+ /** Error code for programmatic handling */
1063
+ readonly code: string;
1064
+ /** Best-effort origin of the failing request */
1065
+ readonly origin?: SandboxErrorOrigin;
1066
+ /** Request path or endpoint when known */
1067
+ readonly endpoint?: string;
1068
+ /** Retry-after duration in ms when surfaced by the upstream */
1069
+ readonly retryAfterMs?: number;
1070
+ /** Sidecar version when the runtime emitted it */
1071
+ readonly sidecarVersion?: string;
1072
+ /** Sidecar image/tag/sha when the runtime emitted it */
1073
+ readonly containerImage?: string;
1074
+ constructor(message: string, code: string, status?: number, metadata?: SandboxErrorMetadata);
1075
+ }
1076
+ type SandboxErrorOrigin = "sidecar" | "sandbox-api" | "control-plane" | "runtime" | "unknown";
1077
+ interface SandboxErrorMetadata {
1078
+ origin?: SandboxErrorOrigin;
1079
+ endpoint?: string;
1080
+ retryAfterMs?: number;
1081
+ sidecarVersion?: string;
1082
+ containerImage?: string;
1083
+ }
1084
+ type SandboxErrorJson = string | number | boolean | null | {
1085
+ [key: string]: SandboxErrorJson;
1086
+ } | SandboxErrorJson[];
1087
+ type SandboxFailureDetail = {
1088
+ [key: string]: SandboxErrorJson;
1089
+ };
1090
+ /**
1091
+ * Authentication failed or API key is invalid.
1092
+ */
1093
+ declare class AuthError extends SandboxError {
1094
+ constructor(message?: string, metadata?: SandboxErrorMetadata);
1095
+ }
1096
+ /**
1097
+ * The requested resource was not found.
1098
+ */
1099
+ declare class NotFoundError extends SandboxError {
1100
+ /** The resource type that was not found */
1101
+ readonly resourceType: string;
1102
+ /** The resource ID that was not found */
1103
+ readonly resourceId: string;
1104
+ constructor(resourceType: string, resourceId: string, metadata?: SandboxErrorMetadata);
1105
+ }
1106
+ /**
1107
+ * Account quota or rate limit exceeded.
1108
+ */
1109
+ declare class QuotaError extends SandboxError {
1110
+ /** The type of quota that was exceeded */
1111
+ readonly quotaType: string;
1112
+ /** Current usage */
1113
+ readonly current?: number;
1114
+ /** Maximum allowed */
1115
+ readonly limit?: number;
1116
+ /** Suggested retry-after duration in ms */
1117
+ readonly retryAfterMs?: number;
1118
+ constructor(quotaType: string, message?: string, current?: number, limit?: number, metadata?: SandboxErrorMetadata, status?: number);
1119
+ }
1120
+ /**
1121
+ * The requested capability is unavailable for the account, driver, or sandbox.
1122
+ */
1123
+ declare class CapabilityError extends SandboxError {
1124
+ /** Capability or feature that was rejected when known */
1125
+ readonly capability?: string;
1126
+ constructor(message: string, code?: string, status?: number, metadata?: SandboxErrorMetadata, capability?: string);
1127
+ }
1128
+ /**
1129
+ * A multi-resource operation failed for one or more branches.
1130
+ */
1131
+ declare class PartialFailureError extends SandboxError {
1132
+ /** Per-resource failures returned by the API when available */
1133
+ readonly failures?: SandboxFailureDetail[];
1134
+ constructor(message: string, code?: string, status?: number, metadata?: SandboxErrorMetadata, failures?: SandboxFailureDetail[]);
1135
+ }
1136
+ /**
1137
+ * The request was invalid or malformed.
1138
+ */
1139
+ declare class ValidationError extends SandboxError {
1140
+ /** Field-level validation errors */
1141
+ readonly fields?: Record<string, string>;
1142
+ constructor(message: string, fields?: Record<string, string>, metadata?: SandboxErrorMetadata);
1143
+ }
1144
+ /**
1145
+ * The sandbox is not in a valid state for the requested operation.
1146
+ */
1147
+ declare class StateError extends SandboxError {
1148
+ /** Current state of the sandbox */
1149
+ readonly currentState: string;
1150
+ /** Required state for the operation */
1151
+ readonly requiredState?: string;
1152
+ constructor(message: string, currentState: string, requiredState?: string, metadata?: SandboxErrorMetadata);
1153
+ }
1154
+ /**
1155
+ * The request timed out.
1156
+ */
1157
+ declare class TimeoutError extends SandboxError {
1158
+ /** Timeout duration in milliseconds */
1159
+ readonly timeoutMs: number;
1160
+ constructor(timeoutMs: number, message?: string, metadata?: SandboxErrorMetadata);
1161
+ }
1162
+ /**
1163
+ * A network or connection error occurred.
1164
+ */
1165
+ declare class NetworkError extends SandboxError {
1166
+ /** The underlying error */
1167
+ readonly cause?: Error;
1168
+ constructor(message: string, causeOrMetadata?: Error | SandboxErrorMetadata, metadata?: SandboxErrorMetadata);
1169
+ }
1170
+ /**
1171
+ * The server returned an unexpected error.
1172
+ */
1173
+ declare class ServerError extends SandboxError {
1174
+ constructor(message: string, status?: number, metadata?: SandboxErrorMetadata);
1175
+ }
1176
+ //#endregion
1177
+ export { IntegrationAction as A, TriggerRun as B, CreateAutomationInput as C, EndpointInfo as D, DeliveryAttempt as E, IntegrationScope as F, ParsedSSEEvent as G, SandboxFleet as H, IntegrationVerificationKind as I, parseSSEStream as K, IntegrationsManager as L, IntegrationDeliveryStatus as M, IntegrationPrincipalType as N, EndpointWithSecret as O, IntegrationProvider as P, RecipeManifest as R, ConnectionInfo as S, CreateTriggerInput as T, SandboxFleetClient as U, TriggerWithSecret as V, ParseSSEStreamOptions as W, SandboxClient as _, PartialFailureError as a, TeamMember as b, SandboxErrorJson as c, StateError as d, TimeoutError as f, InviteTeamMemberOptions as g, IntelligenceClient as h, NotFoundError as i, IntegrationActionKind as j, InstallRecipeInput as k, SandboxFailureDetail as l, CreateTeamOptions as m, CapabilityError as n, QuotaError as o, ValidationError as p, NetworkError as r, SandboxError as s, AuthError as t, ServerError as u, Team as v, CreateEndpointInput as w, AutomationInfo as x, TeamInvitation as y, TriggerInfo as z };