@trigger.dev/core 4.2.0 → 4.3.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.
Files changed (47) hide show
  1. package/dist/commonjs/v3/apiClient/errors.d.ts +25 -0
  2. package/dist/commonjs/v3/apiClient/errors.js +29 -1
  3. package/dist/commonjs/v3/apiClient/errors.js.map +1 -1
  4. package/dist/commonjs/v3/apiClient/index.d.ts +54 -2
  5. package/dist/commonjs/v3/apiClient/index.js +280 -0
  6. package/dist/commonjs/v3/apiClient/index.js.map +1 -1
  7. package/dist/commonjs/v3/apiClient/streamBatchItems.test.d.ts +1 -0
  8. package/dist/commonjs/v3/apiClient/streamBatchItems.test.js +369 -0
  9. package/dist/commonjs/v3/apiClient/streamBatchItems.test.js.map +1 -0
  10. package/dist/commonjs/v3/idempotencyKeys.d.ts +5 -0
  11. package/dist/commonjs/v3/idempotencyKeys.js +10 -1
  12. package/dist/commonjs/v3/idempotencyKeys.js.map +1 -1
  13. package/dist/commonjs/v3/schemas/api.d.ts +403 -10
  14. package/dist/commonjs/v3/schemas/api.js +126 -5
  15. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  16. package/dist/commonjs/v3/schemas/messages.d.ts +2 -2
  17. package/dist/commonjs/v3/schemas/runEngine.d.ts +1 -0
  18. package/dist/commonjs/v3/schemas/runEngine.js +1 -0
  19. package/dist/commonjs/v3/schemas/runEngine.js.map +1 -1
  20. package/dist/commonjs/v3/types/tasks.d.ts +53 -4
  21. package/dist/commonjs/v3/zodSocket.js +1 -1
  22. package/dist/commonjs/v3/zodSocket.js.map +1 -1
  23. package/dist/commonjs/version.js +1 -1
  24. package/dist/esm/v3/apiClient/errors.d.ts +25 -0
  25. package/dist/esm/v3/apiClient/errors.js +27 -0
  26. package/dist/esm/v3/apiClient/errors.js.map +1 -1
  27. package/dist/esm/v3/apiClient/index.d.ts +54 -2
  28. package/dist/esm/v3/apiClient/index.js +282 -2
  29. package/dist/esm/v3/apiClient/index.js.map +1 -1
  30. package/dist/esm/v3/apiClient/streamBatchItems.test.d.ts +1 -0
  31. package/dist/esm/v3/apiClient/streamBatchItems.test.js +367 -0
  32. package/dist/esm/v3/apiClient/streamBatchItems.test.js.map +1 -0
  33. package/dist/esm/v3/idempotencyKeys.d.ts +5 -0
  34. package/dist/esm/v3/idempotencyKeys.js +9 -1
  35. package/dist/esm/v3/idempotencyKeys.js.map +1 -1
  36. package/dist/esm/v3/schemas/api.d.ts +403 -10
  37. package/dist/esm/v3/schemas/api.js +123 -2
  38. package/dist/esm/v3/schemas/api.js.map +1 -1
  39. package/dist/esm/v3/schemas/messages.d.ts +2 -2
  40. package/dist/esm/v3/schemas/runEngine.d.ts +1 -0
  41. package/dist/esm/v3/schemas/runEngine.js +1 -0
  42. package/dist/esm/v3/schemas/runEngine.js.map +1 -1
  43. package/dist/esm/v3/types/tasks.d.ts +53 -4
  44. package/dist/esm/v3/zodSocket.js +1 -1
  45. package/dist/esm/v3/zodSocket.js.map +1 -1
  46. package/dist/esm/version.js +1 -1
  47. package/package.json +1 -1
@@ -52,3 +52,28 @@ export declare class ApiSchemaValidationError extends ApiError {
52
52
  headers: APIHeaders | undefined;
53
53
  });
54
54
  }
55
+ /**
56
+ * Error thrown when a batch stream completes but the batch was not sealed.
57
+ * This indicates that not all expected items were received by the server.
58
+ * The client should retry sending all items, or investigate the mismatch.
59
+ */
60
+ export declare class BatchNotSealedError extends Error {
61
+ readonly name = "BatchNotSealedError";
62
+ /** The batch ID that was not sealed */
63
+ readonly batchId: string;
64
+ /** Number of items currently enqueued on the server */
65
+ readonly enqueuedCount: number;
66
+ /** Number of items expected to complete the batch */
67
+ readonly expectedCount: number;
68
+ /** Number of items accepted in this request */
69
+ readonly itemsAccepted: number;
70
+ /** Number of items deduplicated in this request */
71
+ readonly itemsDeduplicated: number;
72
+ constructor(options: {
73
+ batchId: string;
74
+ enqueuedCount: number;
75
+ expectedCount: number;
76
+ itemsAccepted: number;
77
+ itemsDeduplicated: number;
78
+ });
79
+ }
@@ -130,6 +130,33 @@ export class ApiSchemaValidationError extends ApiError {
130
130
  this.rawBody = rawBody;
131
131
  }
132
132
  }
133
+ /**
134
+ * Error thrown when a batch stream completes but the batch was not sealed.
135
+ * This indicates that not all expected items were received by the server.
136
+ * The client should retry sending all items, or investigate the mismatch.
137
+ */
138
+ export class BatchNotSealedError extends Error {
139
+ name = "BatchNotSealedError";
140
+ /** The batch ID that was not sealed */
141
+ batchId;
142
+ /** Number of items currently enqueued on the server */
143
+ enqueuedCount;
144
+ /** Number of items expected to complete the batch */
145
+ expectedCount;
146
+ /** Number of items accepted in this request */
147
+ itemsAccepted;
148
+ /** Number of items deduplicated in this request */
149
+ itemsDeduplicated;
150
+ constructor(options) {
151
+ const message = `Batch ${options.batchId} was not sealed: received ${options.enqueuedCount} of ${options.expectedCount} expected items (accepted: ${options.itemsAccepted}, deduplicated: ${options.itemsDeduplicated})`;
152
+ super(message);
153
+ this.batchId = options.batchId;
154
+ this.enqueuedCount = options.enqueuedCount;
155
+ this.expectedCount = options.expectedCount;
156
+ this.itemsAccepted = options.itemsAccepted;
157
+ this.itemsDeduplicated = options.itemsDeduplicated;
158
+ }
159
+ }
133
160
  function castToError(err) {
134
161
  if (err instanceof Error)
135
162
  return err;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/v3/apiClient/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/v3/apiClient/errors.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { AddTagsRequestBody, ApiDeploymentListOptions, BatchTaskRunExecutionResult, BatchTriggerTaskV3RequestBody, CompleteWaitpointTokenRequestBody, CreateEnvironmentVariableRequestBody, CreateScheduleOptions, CreateWaitpointTokenRequestBody, CreateWaitpointTokenResponseBody, ListQueueOptions, ListRunResponseItem, ListScheduleOptions, RescheduleRunRequestBody, RetrieveQueueParam, TaskRunExecutionResult, TriggerTaskRequestBody, UpdateEnvironmentVariableRequestBody, UpdateMetadataRequestBody, UpdateScheduleOptions, WaitForDurationRequestBody, WaitpointTokenItem } from "../schemas/index.js";
2
+ import { AddTagsRequestBody, ApiDeploymentListOptions, BatchItemNDJSON, BatchTaskRunExecutionResult, BatchTriggerTaskV3RequestBody, CompleteWaitpointTokenRequestBody, CreateBatchRequestBody, CreateBatchResponse, CreateEnvironmentVariableRequestBody, CreateScheduleOptions, CreateWaitpointTokenRequestBody, CreateWaitpointTokenResponseBody, ListQueueOptions, ListRunResponseItem, ListScheduleOptions, RescheduleRunRequestBody, RetrieveQueueParam, StreamBatchItemsResponse, TaskRunExecutionResult, TriggerTaskRequestBody, UpdateEnvironmentVariableRequestBody, UpdateMetadataRequestBody, UpdateScheduleOptions, WaitForDurationRequestBody, WaitpointTokenItem } from "../schemas/index.js";
3
3
  import { AsyncIterableStream } from "../streams/asyncIterableStream.js";
4
4
  import { AnyRunTypes, TriggerJwtOptions } from "../types/tasks.js";
5
5
  import { Prettify } from "../types/utils.js";
@@ -10,6 +10,9 @@ import { ApiClientConfiguration } from "../apiClientManager-api.js";
10
10
  export type CreateWaitpointTokenResponse = Prettify<CreateWaitpointTokenResponseBody & {
11
11
  publicAccessToken: string;
12
12
  }>;
13
+ export type CreateBatchApiResponse = Prettify<CreateBatchResponse & {
14
+ publicAccessToken: string;
15
+ }>;
13
16
  export type { CreateEnvironmentVariableParams, ImportEnvironmentVariablesParams, SubscribeToRunsQueryParams, UpdateEnvironmentVariableParams, RealtimeRunSkipColumns, };
14
17
  export type ClientTriggerOptions = {
15
18
  spanParentAsLink?: boolean;
@@ -55,6 +58,43 @@ export declare class ApiClient {
55
58
  id: string;
56
59
  runCount: number;
57
60
  }>;
61
+ /**
62
+ * Phase 1 of 2-phase batch API: Create a batch
63
+ *
64
+ * Creates a new batch and returns its ID. For batchTriggerAndWait,
65
+ * the parent run is blocked immediately on batch creation.
66
+ *
67
+ * @param body - The batch creation parameters
68
+ * @param clientOptions - Options for trace context handling
69
+ * @param clientOptions.spanParentAsLink - If true, child runs will have separate trace IDs with a link to parent
70
+ * @param requestOptions - Optional request options
71
+ * @returns The created batch with ID and metadata
72
+ */
73
+ createBatch(body: CreateBatchRequestBody, clientOptions?: ClientTriggerOptions, requestOptions?: TriggerRequestOptions): Promise<{
74
+ publicAccessToken: string;
75
+ id: string;
76
+ isCached: boolean;
77
+ runCount: number;
78
+ idempotencyKey?: string | undefined;
79
+ }>;
80
+ /**
81
+ * Phase 2 of 2-phase batch API: Stream batch items
82
+ *
83
+ * Streams batch items as NDJSON to the server. Each item is enqueued
84
+ * as it arrives. The batch is automatically sealed when the stream completes.
85
+ *
86
+ * Includes automatic retry with exponential backoff. Since items are deduplicated
87
+ * by index on the server, retrying the entire stream is safe.
88
+ *
89
+ * Uses ReadableStream.tee() for retry capability without buffering all items
90
+ * upfront - only items consumed before a failure are buffered for retry.
91
+ *
92
+ * @param batchId - The batch ID from createBatch
93
+ * @param items - Array or async iterable of batch items
94
+ * @param requestOptions - Optional request options
95
+ * @returns Summary of items accepted and deduplicated
96
+ */
97
+ streamBatchItems(batchId: string, items: BatchItemNDJSON[] | AsyncIterable<BatchItemNDJSON>, requestOptions?: ApiRequestOptions): Promise<StreamBatchItemsResponse>;
58
98
  createUploadPayloadUrl(filename: string, requestOptions?: ZodFetchOptions): ApiPromise<{
59
99
  presignedUrl: string;
60
100
  }>;
@@ -240,6 +280,9 @@ export declare class ApiClient {
240
280
  cancelRun(runId: string, requestOptions?: ZodFetchOptions): ApiPromise<{
241
281
  id: string;
242
282
  }>;
283
+ resetIdempotencyKey(taskIdentifier: string, idempotencyKey: string, requestOptions?: ZodFetchOptions): ApiPromise<{
284
+ id: string;
285
+ }>;
243
286
  rescheduleRun(runId: string, body: RescheduleRunRequestBody, requestOptions?: ZodFetchOptions): ApiPromise<{
244
287
  status: "PENDING_VERSION" | "QUEUED" | "DEQUEUED" | "EXECUTING" | "WAITING" | "COMPLETED" | "CANCELED" | "FAILED" | "CRASHED" | "SYSTEM_FAILURE" | "DELAYED" | "EXPIRED" | "TIMED_OUT";
245
288
  id: string;
@@ -842,12 +885,21 @@ export declare class ApiClient {
842
885
  }>;
843
886
  generateJWTClaims(requestOptions?: ZodFetchOptions): Promise<Record<string, any>>;
844
887
  retrieveBatch(batchId: string, requestOptions?: ZodFetchOptions): ApiPromise<{
845
- status: "COMPLETED" | "PENDING";
888
+ status: "COMPLETED" | "PENDING" | "PROCESSING" | "PARTIAL_FAILED" | "ABORTED";
846
889
  id: string;
847
890
  createdAt: Date;
848
891
  updatedAt: Date;
849
892
  runs: string[];
850
893
  runCount: number;
894
+ processing: {
895
+ errors: {
896
+ error: string;
897
+ taskIdentifier: string;
898
+ index: number;
899
+ errorCode?: string | undefined;
900
+ }[];
901
+ completedAt?: Date | undefined;
902
+ };
851
903
  idempotencyKey?: string | undefined;
852
904
  }>;
853
905
  }
@@ -1,10 +1,11 @@
1
1
  import { z } from "zod";
2
2
  import { VERSION } from "../../version.js";
3
3
  import { generateJWT } from "../jwt.js";
4
- import { ApiDeploymentListResponseItem, AppendToStreamResponseBody, BatchTaskRunExecutionResult, BatchTriggerTaskV3Response, CanceledRunResponse, CompleteWaitpointTokenResponseBody, CreateStreamResponseBody, CreateUploadPayloadUrlResponseBody, CreateWaitpointTokenResponseBody, DeletedScheduleObject, EnvironmentVariableResponseBody, EnvironmentVariableWithSecret, ListRunResponseItem, QueueItem, ReplayRunResponse, RetrieveBatchV2Response, RetrieveRunResponse, RetrieveRunTraceResponseBody, ScheduleObject, TaskRunExecutionResult, TriggerTaskResponse, UpdateMetadataResponseBody, WaitForDurationResponseBody, WaitForWaitpointTokenResponseBody, WaitpointRetrieveTokenResponse, WaitpointTokenItem, } from "../schemas/index.js";
4
+ import { ApiDeploymentListResponseItem, AppendToStreamResponseBody, BatchTaskRunExecutionResult, BatchTriggerTaskV3Response, CanceledRunResponse, CompleteWaitpointTokenResponseBody, CreateBatchResponse, CreateStreamResponseBody, CreateUploadPayloadUrlResponseBody, CreateWaitpointTokenResponseBody, DeletedScheduleObject, EnvironmentVariableResponseBody, EnvironmentVariableWithSecret, ListRunResponseItem, QueueItem, ReplayRunResponse, ResetIdempotencyKeyResponse, RetrieveBatchV2Response, RetrieveRunResponse, RetrieveRunTraceResponseBody, ScheduleObject, StreamBatchItemsResponse, TaskRunExecutionResult, TriggerTaskResponse, UpdateMetadataResponseBody, WaitForDurationResponseBody, WaitForWaitpointTokenResponseBody, WaitpointRetrieveTokenResponse, WaitpointTokenItem, } from "../schemas/index.js";
5
5
  import { taskContext } from "../task-context-api.js";
6
6
  import { isRequestOptions, zodfetch, zodfetchCursorPage, zodfetchOffsetLimitPage, } from "./core.js";
7
- import { ApiError } from "./errors.js";
7
+ import { ApiConnectionError, ApiError, BatchNotSealedError } from "./errors.js";
8
+ import { calculateNextRetryDelay } from "../utils/retries.js";
8
9
  import { SSEStreamSubscriptionFactory, SSEStreamSubscription, runShapeStream, } from "./runStream.js";
9
10
  import { API_VERSION, API_VERSION_HEADER_NAME } from "./version.js";
10
11
  import { getEnvVar } from "../utils/getEnv.js";
@@ -132,6 +133,165 @@ export class ApiClient {
132
133
  };
133
134
  });
134
135
  }
136
+ /**
137
+ * Phase 1 of 2-phase batch API: Create a batch
138
+ *
139
+ * Creates a new batch and returns its ID. For batchTriggerAndWait,
140
+ * the parent run is blocked immediately on batch creation.
141
+ *
142
+ * @param body - The batch creation parameters
143
+ * @param clientOptions - Options for trace context handling
144
+ * @param clientOptions.spanParentAsLink - If true, child runs will have separate trace IDs with a link to parent
145
+ * @param requestOptions - Optional request options
146
+ * @returns The created batch with ID and metadata
147
+ */
148
+ createBatch(body, clientOptions, requestOptions) {
149
+ return zodfetch(CreateBatchResponse, `${this.baseUrl}/api/v3/batches`, {
150
+ method: "POST",
151
+ headers: this.#getHeaders(clientOptions?.spanParentAsLink ?? false),
152
+ body: JSON.stringify(body),
153
+ }, mergeRequestOptions(this.defaultRequestOptions, requestOptions))
154
+ .withResponse()
155
+ .then(async ({ data, response }) => {
156
+ const claimsHeader = response.headers.get("x-trigger-jwt-claims");
157
+ const claims = claimsHeader ? JSON.parse(claimsHeader) : undefined;
158
+ const jwt = await generateJWT({
159
+ secretKey: this.accessToken,
160
+ payload: {
161
+ ...claims,
162
+ scopes: [`read:batch:${data.id}`],
163
+ },
164
+ expirationTime: requestOptions?.publicAccessToken?.expirationTime ?? "1h",
165
+ });
166
+ return {
167
+ ...data,
168
+ publicAccessToken: jwt,
169
+ };
170
+ });
171
+ }
172
+ /**
173
+ * Phase 2 of 2-phase batch API: Stream batch items
174
+ *
175
+ * Streams batch items as NDJSON to the server. Each item is enqueued
176
+ * as it arrives. The batch is automatically sealed when the stream completes.
177
+ *
178
+ * Includes automatic retry with exponential backoff. Since items are deduplicated
179
+ * by index on the server, retrying the entire stream is safe.
180
+ *
181
+ * Uses ReadableStream.tee() for retry capability without buffering all items
182
+ * upfront - only items consumed before a failure are buffered for retry.
183
+ *
184
+ * @param batchId - The batch ID from createBatch
185
+ * @param items - Array or async iterable of batch items
186
+ * @param requestOptions - Optional request options
187
+ * @returns Summary of items accepted and deduplicated
188
+ */
189
+ async streamBatchItems(batchId, items, requestOptions) {
190
+ // Convert input to ReadableStream for uniform handling and tee() support
191
+ const stream = createNdjsonStream(items);
192
+ const retryOptions = {
193
+ ...DEFAULT_STREAM_BATCH_RETRY_OPTIONS,
194
+ ...requestOptions?.retry,
195
+ };
196
+ return this.#streamBatchItemsWithRetry(batchId, stream, retryOptions);
197
+ }
198
+ async #streamBatchItemsWithRetry(batchId, stream, retryOptions, attempt = 1) {
199
+ const headers = this.#getHeaders(false);
200
+ headers["Content-Type"] = "application/x-ndjson";
201
+ // Tee the stream: one branch for this attempt, one for potential retry
202
+ // tee() internally buffers data consumed from one branch for the other,
203
+ // so we only buffer what's been sent before a failure occurs
204
+ const [forRequest, forRetry] = stream.tee();
205
+ try {
206
+ const response = await fetch(`${this.baseUrl}/api/v3/batches/${batchId}/items`, {
207
+ method: "POST",
208
+ headers,
209
+ body: forRequest,
210
+ // @ts-expect-error - duplex is required for streaming body but not in types
211
+ duplex: "half",
212
+ });
213
+ if (!response.ok) {
214
+ const retryResult = shouldRetryStreamBatchItems(response, attempt, retryOptions);
215
+ if (retryResult.retry) {
216
+ // Cancel the request stream before retry to prevent tee() from buffering
217
+ await forRequest.cancel();
218
+ await sleep(retryResult.delay);
219
+ // Use the backup stream for retry
220
+ return this.#streamBatchItemsWithRetry(batchId, forRetry, retryOptions, attempt + 1);
221
+ }
222
+ // Not retrying - cancel the backup stream
223
+ await forRetry.cancel();
224
+ const errText = await response.text().catch((e) => e.message);
225
+ let errJSON;
226
+ try {
227
+ errJSON = JSON.parse(errText);
228
+ }
229
+ catch {
230
+ // ignore
231
+ }
232
+ const errMessage = errJSON ? undefined : errText;
233
+ const responseHeaders = Object.fromEntries(response.headers.entries());
234
+ throw ApiError.generate(response.status, errJSON, errMessage, responseHeaders);
235
+ }
236
+ const result = await response.json();
237
+ const parsed = StreamBatchItemsResponse.safeParse(result);
238
+ if (!parsed.success) {
239
+ // Cancel backup stream since we're throwing
240
+ await forRetry.cancel();
241
+ throw new Error(`Invalid response from server for batch ${batchId}: ${parsed.error.message}`);
242
+ }
243
+ // Check if the batch was sealed
244
+ if (!parsed.data.sealed) {
245
+ // Not all items were received - treat as retryable condition
246
+ const delay = calculateNextRetryDelay(retryOptions, attempt);
247
+ if (delay) {
248
+ // Cancel the request stream before retry to prevent tee() from buffering
249
+ await forRequest.cancel();
250
+ // Retry with the backup stream
251
+ await sleep(delay);
252
+ return this.#streamBatchItemsWithRetry(batchId, forRetry, retryOptions, attempt + 1);
253
+ }
254
+ // No more retries - cancel backup stream and throw descriptive error
255
+ await forRetry.cancel();
256
+ throw new BatchNotSealedError({
257
+ batchId,
258
+ enqueuedCount: parsed.data.enqueuedCount ?? 0,
259
+ expectedCount: parsed.data.expectedCount ?? 0,
260
+ itemsAccepted: parsed.data.itemsAccepted,
261
+ itemsDeduplicated: parsed.data.itemsDeduplicated,
262
+ });
263
+ }
264
+ // Success - cancel the backup stream to release resources
265
+ await forRetry.cancel();
266
+ return parsed.data;
267
+ }
268
+ catch (error) {
269
+ // Don't retry BatchNotSealedError (retries already exhausted)
270
+ if (error instanceof BatchNotSealedError) {
271
+ throw error;
272
+ }
273
+ // Don't retry ApiErrors (already handled above with backup stream cancelled)
274
+ if (error instanceof ApiError) {
275
+ throw error;
276
+ }
277
+ // Retry connection errors using the backup stream
278
+ const delay = calculateNextRetryDelay(retryOptions, attempt);
279
+ if (delay) {
280
+ // Cancel the request stream before retry to prevent tee() from buffering
281
+ await forRequest.cancel();
282
+ await sleep(delay);
283
+ return this.#streamBatchItemsWithRetry(batchId, forRetry, retryOptions, attempt + 1);
284
+ }
285
+ // No more retries - cancel the backup stream
286
+ await forRetry.cancel();
287
+ // Wrap in a more descriptive error
288
+ const cause = error instanceof Error ? error : new Error(String(error));
289
+ throw new ApiConnectionError({
290
+ cause,
291
+ message: `Failed to stream batch items for batch ${batchId}: ${cause.message}`,
292
+ });
293
+ }
294
+ }
135
295
  createUploadPayloadUrl(filename, requestOptions) {
136
296
  return zodfetch(CreateUploadPayloadUrlResponseBody, `${this.baseUrl}/api/v1/packets/${filename}`, {
137
297
  method: "PUT",
@@ -195,6 +355,13 @@ export class ApiClient {
195
355
  headers: this.#getHeaders(false),
196
356
  }, mergeRequestOptions(this.defaultRequestOptions, requestOptions));
197
357
  }
358
+ resetIdempotencyKey(taskIdentifier, idempotencyKey, requestOptions) {
359
+ return zodfetch(ResetIdempotencyKeyResponse, `${this.baseUrl}/api/v1/idempotencyKeys/${encodeURIComponent(idempotencyKey)}/reset`, {
360
+ method: "POST",
361
+ headers: this.#getHeaders(false),
362
+ body: JSON.stringify({ taskIdentifier }),
363
+ }, mergeRequestOptions(this.defaultRequestOptions, requestOptions));
364
+ }
198
365
  rescheduleRun(runId, body, requestOptions) {
199
366
  return zodfetch(RetrieveRunResponse, `${this.baseUrl}/api/v1/runs/${runId}/reschedule`, {
200
367
  method: "POST",
@@ -721,6 +888,119 @@ function createSearchQueryForListWaitpointTokens(query) {
721
888
  }
722
889
  return searchParams;
723
890
  }
891
+ // ============================================================================
892
+ // Stream Batch Items Retry Helpers
893
+ // ============================================================================
894
+ /**
895
+ * Default retry options for streaming batch items.
896
+ * Uses higher values than the default zodfetch retry since batch operations
897
+ * are more expensive to repeat from scratch.
898
+ */
899
+ const DEFAULT_STREAM_BATCH_RETRY_OPTIONS = {
900
+ maxAttempts: 5,
901
+ factor: 2,
902
+ minTimeoutInMs: 1000,
903
+ maxTimeoutInMs: 30_000,
904
+ randomize: true,
905
+ };
906
+ /**
907
+ * Determines if a failed stream batch items request should be retried.
908
+ * Follows similar logic to zodfetch's shouldRetry but specific to batch streaming.
909
+ */
910
+ function shouldRetryStreamBatchItems(response, attempt, retryOptions) {
911
+ function shouldRetryForOptions() {
912
+ const delay = calculateNextRetryDelay(retryOptions, attempt);
913
+ if (delay) {
914
+ return { retry: true, delay };
915
+ }
916
+ return { retry: false };
917
+ }
918
+ // Check x-should-retry header - server can explicitly control retry behavior
919
+ const shouldRetryHeader = response.headers.get("x-should-retry");
920
+ if (shouldRetryHeader === "true")
921
+ return shouldRetryForOptions();
922
+ if (shouldRetryHeader === "false")
923
+ return { retry: false };
924
+ // Retry on request timeouts
925
+ if (response.status === 408)
926
+ return shouldRetryForOptions();
927
+ // Retry on lock timeouts
928
+ if (response.status === 409)
929
+ return shouldRetryForOptions();
930
+ // Retry on rate limits with special handling for Retry-After
931
+ if (response.status === 429) {
932
+ if (attempt >= retryOptions.maxAttempts) {
933
+ return { retry: false };
934
+ }
935
+ // x-ratelimit-reset is the unix timestamp in milliseconds when the rate limit will reset
936
+ const resetAtUnixEpochMs = response.headers.get("x-ratelimit-reset");
937
+ if (resetAtUnixEpochMs) {
938
+ const resetAtUnixEpoch = parseInt(resetAtUnixEpochMs, 10);
939
+ const delay = resetAtUnixEpoch - Date.now() + Math.floor(Math.random() * 1000);
940
+ if (delay > 0) {
941
+ return { retry: true, delay };
942
+ }
943
+ }
944
+ // Fall back to Retry-After header (seconds)
945
+ const retryAfter = response.headers.get("retry-after");
946
+ if (retryAfter) {
947
+ const retryAfterSeconds = parseInt(retryAfter, 10);
948
+ if (!isNaN(retryAfterSeconds)) {
949
+ return { retry: true, delay: retryAfterSeconds * 1000 };
950
+ }
951
+ }
952
+ return shouldRetryForOptions();
953
+ }
954
+ // Retry on server errors (5xx)
955
+ if (response.status >= 500)
956
+ return shouldRetryForOptions();
957
+ // Don't retry client errors (4xx) except those handled above
958
+ return { retry: false };
959
+ }
960
+ /**
961
+ * Simple sleep utility for retry delays.
962
+ */
963
+ function sleep(ms) {
964
+ return new Promise((resolve) => setTimeout(resolve, ms));
965
+ }
966
+ // ============================================================================
967
+ // NDJSON Stream Helpers
968
+ // ============================================================================
969
+ /**
970
+ * Creates a ReadableStream that emits NDJSON (newline-delimited JSON) from items.
971
+ * Handles both arrays and async iterables for streaming large batches.
972
+ */
973
+ function createNdjsonStream(items) {
974
+ const encoder = new TextEncoder();
975
+ // Check if items is an array
976
+ if (Array.isArray(items)) {
977
+ let index = 0;
978
+ return new ReadableStream({
979
+ pull(controller) {
980
+ if (index >= items.length) {
981
+ controller.close();
982
+ return;
983
+ }
984
+ const item = items[index++];
985
+ const line = JSON.stringify(item) + "\n";
986
+ controller.enqueue(encoder.encode(line));
987
+ },
988
+ });
989
+ }
990
+ // Handle async iterable
991
+ const iterator = items[Symbol.asyncIterator]();
992
+ return new ReadableStream({
993
+ async pull(controller) {
994
+ const { value, done } = await iterator.next();
995
+ if (done) {
996
+ controller.close();
997
+ return;
998
+ }
999
+ const line = JSON.stringify(value) + "\n";
1000
+ controller.enqueue(encoder.encode(line));
1001
+ },
1002
+ });
1003
+ }
724
1004
  export function mergeRequestOptions(defaultOptions, options) {
725
1005
  if (!options) {
726
1006
  return defaultOptions;