deepline 0.3.141 → 0.3.142

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 (25) hide show
  1. package/dist/bundling-sources/sdk/src/release.ts +1 -1
  2. package/dist/bundling-sources/sdk/src/types.ts +65 -2
  3. package/dist/bundling-sources/shared_libs/observability/dlq.ts +11 -0
  4. package/dist/bundling-sources/shared_libs/observability/queue-health.ts +111 -0
  5. package/dist/bundling-sources/shared_libs/play-runtime/bettercontact-batching.ts +34 -8
  6. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +271 -44
  7. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +25 -6
  8. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +132 -8
  9. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +3 -1
  10. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +49 -54
  11. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +14 -7
  12. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-rate-state.ts +118 -29
  13. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-queue-health.ts +183 -36
  14. package/dist/bundling-sources/shared_libs/product-notifications/events.ts +4 -1
  15. package/dist/cli/index.js +242 -12
  16. package/dist/cli/index.mjs +242 -12
  17. package/dist/index.d.mts +54 -2
  18. package/dist/index.d.ts +54 -2
  19. package/dist/index.js +1 -1
  20. package/dist/index.mjs +1 -1
  21. package/dist/release.d.mts +1 -1
  22. package/dist/release.d.ts +1 -1
  23. package/dist/release.js +1 -1
  24. package/dist/release.mjs +1 -1
  25. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -3068,7 +3068,7 @@ var SDK_RELEASE = {
3068
3068
  // getters keep their established compatibility behavior.
3069
3069
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3070
3070
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3071
- version: "0.3.141",
3071
+ version: "0.3.142",
3072
3072
  updateSummary: "Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.",
3073
3073
  packageCapabilities: {
3074
3074
  updatePreferences: 1
@@ -11091,6 +11091,10 @@ function errorToJsonPayload(error) {
11091
11091
  if (maybeRecord?.details && typeof maybeRecord.details === "object" && !Array.isArray(maybeRecord.details)) {
11092
11092
  details.details = maybeRecord.details;
11093
11093
  }
11094
+ const providerConcurrency = providerConcurrencyDiagnostic(maybeRecord);
11095
+ if (providerConcurrency) {
11096
+ details.providerConcurrency = providerConcurrency;
11097
+ }
11094
11098
  if (typeof maybeRecord?.cause === "string") {
11095
11099
  details.cause = maybeRecord.cause;
11096
11100
  }
@@ -11104,6 +11108,33 @@ function errorToJsonPayload(error) {
11104
11108
  }
11105
11109
  };
11106
11110
  }
11111
+ function formatProviderConcurrencyDiagnostic(error) {
11112
+ const value = error && typeof error === "object" ? error : null;
11113
+ const diagnostic = providerConcurrencyDiagnostic(value);
11114
+ if (!diagnostic) return null;
11115
+ const count = diagnostic.inFlightProviderRequestsAt429;
11116
+ const concurrency = count > 1 ? `${count - 1} other same-provider request${count === 2 ? "" : "s"} overlapped the failed request` : "no other same-provider request was active";
11117
+ return `Provider concurrency at the 429: ${count} active request${count === 1 ? "" : "s"} in this Play execution, including the failed request; ${concurrency}. Other Play executions and direct CLI/API calls are not included.`;
11118
+ }
11119
+ function providerConcurrencyDiagnostic(value) {
11120
+ if (!value || value.origin !== "provider" || value.statusCode !== 429 && value.status !== 429) {
11121
+ return null;
11122
+ }
11123
+ const publicDetails = value.publicDetails;
11124
+ if (!publicDetails || typeof publicDetails !== "object" || Array.isArray(publicDetails)) {
11125
+ return null;
11126
+ }
11127
+ const details = publicDetails;
11128
+ const count = details.inFlightProviderRequestsAt429;
11129
+ if (details.providerConcurrencyScope !== "same_provider_in_play_execution" || details.includesFailedRequest !== true || typeof count !== "number" || !Number.isInteger(count) || count < 1) {
11130
+ return null;
11131
+ }
11132
+ return {
11133
+ scope: "same_provider_in_play_execution",
11134
+ inFlightProviderRequestsAt429: count,
11135
+ includesFailedRequest: true
11136
+ };
11137
+ }
11107
11138
  function printJsonError(error) {
11108
11139
  printJson(errorToJsonPayload(error));
11109
11140
  }
@@ -25382,6 +25413,14 @@ function buildRunPackageTextLines(packaged) {
25382
25413
  const lines = isRuntimeLimitCheckpoint ? runtimeLimitCheckpointLines(packaged, runId, checkpointFailure) : [
25383
25414
  `${status === "completed" ? "\u2713" : status === "failed" ? "\u2717" : "\u2022"} ${status} ${runId}`
25384
25415
  ];
25416
+ const outcome = typeof run.outcome === "string" ? run.outcome : null;
25417
+ if (outcome) lines.push(` outcome: ${outcome}`);
25418
+ const recovery = readRecord(run.recovery);
25419
+ if (recovery) {
25420
+ const mode = typeof recovery.mode === "string" ? recovery.mode : "recovered";
25421
+ const sourceRunId = typeof recovery.sourceRunId === "string" ? ` from ${recovery.sourceRunId}` : "";
25422
+ lines.push(` recovery: ${mode}${sourceRunId}`);
25423
+ }
25385
25424
  const runError = typeof run.error === "string" && run.error.trim() ? run.error.trim() : null;
25386
25425
  const structuredRuntimeLimitMessage = typeof runtimeLimitFailure?.message === "string" && runtimeLimitFailure.message.trim() ? `${typeof runtimeLimitFailure.code === "string" ? runtimeLimitFailure.code : "RUNTIME_LIMIT_EXCEEDED"}: ${runtimeLimitFailure.message.trim()}` : null;
25387
25426
  const displayRunError = structuredRuntimeLimitMessage ?? runError;
@@ -48094,6 +48133,8 @@ function toolContractJsonForDescribe(tool, requestedToolId) {
48094
48133
  const inputSchema = publicToolInputSchemaForDescribe(
48095
48134
  recordField2(tool, "inputSchema", "input_schema")
48096
48135
  );
48136
+ const outputSchemaRecord = recordField2(tool, "outputSchema", "output_schema");
48137
+ const outputFields = toolOutputFieldsForDisplay(outputSchemaRecord);
48097
48138
  const usageGuidance = recordField2(tool, "usageGuidance", "usage_guidance");
48098
48139
  const toolExecutionResult = recordField2(
48099
48140
  usageGuidance,
@@ -48107,6 +48148,18 @@ function toolContractJsonForDescribe(tool, requestedToolId) {
48107
48148
  arrayField2(toolExecutionResult, "extractedValues", "extracted_values")
48108
48149
  );
48109
48150
  const pricing = Capability.fromCatalogEntry(tool).describe().customerCost();
48151
+ const executionMetadataRecord = recordField2(
48152
+ tool,
48153
+ "executionMetadata",
48154
+ "execution_metadata"
48155
+ );
48156
+ const executionMetadata = Object.keys(executionMetadataRecord).length > 0 ? executionMetadataRecord : null;
48157
+ const batchCapabilityRecord = recordField2(
48158
+ tool,
48159
+ "batchCapability",
48160
+ "batch_capability"
48161
+ );
48162
+ const batchCapability = Object.keys(batchCapabilityRecord).length > 0 ? batchCapabilityRecord : null;
48110
48163
  const deprecation = recordField2(tool, "deprecation");
48111
48164
  const replacementToolId = stringField2(
48112
48165
  deprecation,
@@ -48140,14 +48193,14 @@ function toolContractJsonForDescribe(tool, requestedToolId) {
48140
48193
  ...deprecationExecution ? { execution: deprecationExecution } : {}
48141
48194
  }
48142
48195
  } : {},
48143
- inputFields: inputFields.map((field) => ({
48144
- name: field.name,
48145
- type: field.type ?? "unknown",
48146
- required: Boolean(field.required),
48147
- ...field.description ? { description: field.description } : {},
48148
- ...Object.prototype.hasOwnProperty.call(field, "default") ? { default: field.default } : {}
48149
- })),
48196
+ inputFields: inputFields.map(inputFieldJsonForDescribe),
48150
48197
  inputSchema,
48198
+ ...Object.keys(outputSchemaRecord).length > 0 ? {
48199
+ outputSchema: publicToolInputSchemaForDescribe(outputSchemaRecord),
48200
+ outputFields: outputFields.map(inputFieldJsonForDescribe)
48201
+ } : {},
48202
+ ...executionMetadata ? { executionMetadata } : {},
48203
+ ...batchCapability ? { batchCapability } : {},
48151
48204
  cost: pricing,
48152
48205
  getters: {
48153
48206
  extractedLists,
@@ -48299,6 +48352,8 @@ function printCompactToolContract(tool, requestedToolId) {
48299
48352
  if (Array.isArray(contract.categories) && contract.categories.length) {
48300
48353
  console.log(`Tags: ${contract.categories.join(", ")}`);
48301
48354
  }
48355
+ printToolOutputArrayShape(contract);
48356
+ printToolExecutionHints(contract);
48302
48357
  if (contract.deprecated === true) {
48303
48358
  const deprecation = isRecord12(contract.deprecation) ? contract.deprecation : {};
48304
48359
  const message = stringField2(deprecation, "message");
@@ -48335,12 +48390,13 @@ function printCompactToolContract(tool, requestedToolId) {
48335
48390
  const description = stringField2(field, "description");
48336
48391
  const enumValues = Array.isArray(field.enum) ? field.enum : [];
48337
48392
  const enumSuffix = enumValues.length ? ` enum=${enumValues.map(String).join("|")}` : "";
48393
+ const itemBoundsSuffix = arrayItemBoundsSuffix(field);
48338
48394
  const defaultSuffix = Object.prototype.hasOwnProperty.call(
48339
48395
  field,
48340
48396
  "default"
48341
48397
  ) ? ` default=${JSON.stringify(field.default)}` : "";
48342
48398
  console.log(
48343
- `- ${name}${required}: ${type}${enumSuffix}${defaultSuffix}${description ? ` - ${description}` : ""}`
48399
+ `- ${name}${required}: ${type}${enumSuffix}${itemBoundsSuffix}${defaultSuffix}${description ? ` - ${description}` : ""}`
48344
48400
  );
48345
48401
  }
48346
48402
  }
@@ -48420,15 +48476,17 @@ function printToolSchemaOnly(tool, requestedToolId) {
48420
48476
  const description = typeof field.description === "string" ? field.description : "";
48421
48477
  const enumValues = Array.isArray(field.enum) ? field.enum : [];
48422
48478
  const enumSuffix = enumValues.length ? ` enum=${enumValues.map(String).join("|")}` : "";
48479
+ const itemBoundsSuffix = arrayItemBoundsSuffix(field);
48423
48480
  const defaultSuffix = Object.prototype.hasOwnProperty.call(
48424
48481
  field,
48425
48482
  "default"
48426
48483
  ) ? ` default=${JSON.stringify(field.default)}` : "";
48427
48484
  console.log(
48428
- `- ${name}${required}: ${type}${enumSuffix}${defaultSuffix}${description ? ` - ${description}` : ""}`
48485
+ `- ${name}${required}: ${type}${enumSuffix}${itemBoundsSuffix}${defaultSuffix}${description ? ` - ${description}` : ""}`
48429
48486
  );
48430
48487
  }
48431
48488
  }
48489
+ printToolOutputArrayShape(contract);
48432
48490
  const declaredSchema = declaredToolJsonSchema(
48433
48491
  recordField2(contract, "inputSchema")
48434
48492
  );
@@ -48604,11 +48662,19 @@ function toolMetadataJsonForDescribe(tool, requestedToolId) {
48604
48662
  deepline_pricing_details: _snakeDeeplinePricingDetails,
48605
48663
  ...publicTool
48606
48664
  } = tool;
48665
+ const outputSchemaRecord = recordField2(tool, "outputSchema", "output_schema");
48607
48666
  return {
48608
48667
  ...publicTool,
48609
48668
  toolId,
48610
48669
  provider: tool.provider,
48611
48670
  displayName: tool.displayName,
48671
+ ...Object.keys(outputSchemaRecord).length > 0 ? {
48672
+ outputSchema: publicToolInputSchemaForDescribe(outputSchemaRecord),
48673
+ outputFields: toolOutputFieldsForDisplay(outputSchemaRecord).map(
48674
+ inputFieldJsonForDescribe
48675
+ )
48676
+ } : {},
48677
+ inputFields: inputFields.map(inputFieldJsonForDescribe),
48612
48678
  cost: Capability.fromCatalogEntry(tool).describe().customerCost(),
48613
48679
  usageGuidance,
48614
48680
  runtimeOutputHelp: {
@@ -48667,8 +48733,27 @@ function formatListedToolCost(tool) {
48667
48733
  return displayText ? `Cost: ${displayText}` : "";
48668
48734
  }
48669
48735
  function toolInputFieldsForDisplay(inputSchema) {
48670
- if (Array.isArray(inputSchema.fields))
48671
- return inputSchema.fields.filter(isRecord12);
48736
+ if (Array.isArray(inputSchema.fields)) {
48737
+ const fields = inputSchema.fields.filter(isRecord12);
48738
+ if (!isRecord12(inputSchema.jsonSchema)) return fields;
48739
+ const jsonSchemaFields = new Map(
48740
+ recursiveToolInputFieldsForDisplay({
48741
+ jsonSchema: inputSchema.jsonSchema
48742
+ }).flatMap(
48743
+ (field) => typeof field.name === "string" ? [[field.name, field]] : []
48744
+ )
48745
+ );
48746
+ return fields.map((field) => {
48747
+ const jsonSchemaField = typeof field.name === "string" ? jsonSchemaFields.get(field.name) : void 0;
48748
+ const minItems = typeof field.minItems === "number" ? field.minItems : jsonSchemaField?.minItems;
48749
+ const maxItems = typeof field.maxItems === "number" ? field.maxItems : jsonSchemaField?.maxItems;
48750
+ return {
48751
+ ...field,
48752
+ ...typeof minItems === "number" ? { minItems } : {},
48753
+ ...typeof maxItems === "number" ? { maxItems } : {}
48754
+ };
48755
+ });
48756
+ }
48672
48757
  const jsonSchema = isRecord12(inputSchema.jsonSchema) ? inputSchema.jsonSchema : inputSchema;
48673
48758
  const properties = isRecord12(jsonSchema.properties) ? jsonSchema.properties : {};
48674
48759
  const required = Array.isArray(jsonSchema.required) ? new Set(jsonSchema.required.map(String)) : /* @__PURE__ */ new Set();
@@ -48679,10 +48764,36 @@ function toolInputFieldsForDisplay(inputSchema) {
48679
48764
  type: typeof property.type === "string" ? property.type : "unknown",
48680
48765
  required: required.has(name),
48681
48766
  description: property.description,
48767
+ ...typeof property.minItems === "number" ? { minItems: property.minItems } : {},
48768
+ ...typeof property.maxItems === "number" ? { maxItems: property.maxItems } : {},
48682
48769
  ...Object.prototype.hasOwnProperty.call(property, "default") ? { default: property.default } : {}
48683
48770
  };
48684
48771
  });
48685
48772
  }
48773
+ function toolOutputFieldsForDisplay(outputSchema) {
48774
+ if (Object.keys(outputSchema).length === 0) return [];
48775
+ return recursiveToolInputFieldsForDisplay({
48776
+ jsonSchema: outputSchema
48777
+ }).filter(
48778
+ (field) => typeof field.name === "string" && field.name.includes("[]")
48779
+ );
48780
+ }
48781
+ function printToolOutputArrayShape(tool) {
48782
+ const outputFields = toolOutputFieldsForDisplay(
48783
+ recordField2(isRecord12(tool) ? tool : {}, "outputSchema", "output_schema")
48784
+ );
48785
+ if (outputFields.length === 0) return;
48786
+ console.log(" Output array shape (declared schema):");
48787
+ for (const field of outputFields.slice(0, 60)) {
48788
+ const name = String(field.name);
48789
+ const type = stringField2(field, "type") || "unknown";
48790
+ const itemBounds = arrayItemBoundsSuffix(field);
48791
+ console.log(` - ${name}: ${type}${itemBounds}`);
48792
+ }
48793
+ if (outputFields.length > 60) {
48794
+ console.log(` - \u2026 ${outputFields.length - 60} more schema fields`);
48795
+ }
48796
+ }
48686
48797
  function canonicalToolJsonSchema(inputSchema) {
48687
48798
  return isRecord12(inputSchema.jsonSchema) ? inputSchema.jsonSchema : inputSchema;
48688
48799
  }
@@ -48772,6 +48883,8 @@ function recursiveToolInputFieldsForDisplay(inputSchema) {
48772
48883
  required,
48773
48884
  description: schema.description,
48774
48885
  ...Array.isArray(schema.enum) ? { enum: schema.enum } : {},
48886
+ ...typeof schema.minItems === "number" ? { minItems: schema.minItems } : {},
48887
+ ...typeof schema.maxItems === "number" ? { maxItems: schema.maxItems } : {},
48775
48888
  ...Object.prototype.hasOwnProperty.call(schema, "default") ? { default: schema.default } : {}
48776
48889
  });
48777
48890
  }
@@ -48803,6 +48916,121 @@ function recursiveToolInputFieldsForDisplay(inputSchema) {
48803
48916
  visit(root, "", false);
48804
48917
  return fields.size ? [...fields.values()] : toolInputFieldsForDisplay(inputSchema);
48805
48918
  }
48919
+ function inputFieldJsonForDescribe(field) {
48920
+ return {
48921
+ name: field.name,
48922
+ type: field.type ?? "unknown",
48923
+ required: Boolean(field.required),
48924
+ ...field.description ? { description: field.description } : {},
48925
+ ...typeof field.minItems === "number" ? { minItems: field.minItems } : {},
48926
+ ...typeof field.maxItems === "number" ? { maxItems: field.maxItems } : {},
48927
+ ...Object.prototype.hasOwnProperty.call(field, "default") ? { default: field.default } : {}
48928
+ };
48929
+ }
48930
+ function arrayItemBoundsSuffix(field) {
48931
+ const minItems = typeof field.minItems === "number" && Number.isFinite(field.minItems) ? field.minItems : null;
48932
+ const maxItems = typeof field.maxItems === "number" && Number.isFinite(field.maxItems) ? field.maxItems : null;
48933
+ if (minItems !== null && maxItems !== null) {
48934
+ return ` items=${minItems}..${maxItems}`;
48935
+ }
48936
+ if (minItems !== null) return ` minItems=${minItems}`;
48937
+ if (maxItems !== null) return ` maxItems=${maxItems}`;
48938
+ return "";
48939
+ }
48940
+ function printToolExecutionHints(value) {
48941
+ const batchCapabilityRecord = recordField2(
48942
+ isRecord12(value) ? value : {},
48943
+ "batchCapability",
48944
+ "batch_capability"
48945
+ );
48946
+ const batchCapability = Object.keys(batchCapabilityRecord).length > 0 ? batchCapabilityRecord : null;
48947
+ const executionMetadata = recordField2(
48948
+ isRecord12(value) ? value : {},
48949
+ "executionMetadata",
48950
+ "execution_metadata"
48951
+ );
48952
+ if (batchCapability) {
48953
+ const status = stringField2(batchCapability, "status") || "unknown";
48954
+ const surface = stringField2(batchCapability, "surface");
48955
+ const operation = stringField2(
48956
+ batchCapability,
48957
+ "batchOperation",
48958
+ "batch_operation"
48959
+ );
48960
+ const maxBatchSize = numberField2(
48961
+ batchCapability,
48962
+ "maxBatchSize",
48963
+ "max_batch_size"
48964
+ );
48965
+ const notes = stringField2(batchCapability, "notes");
48966
+ console.log("");
48967
+ console.log("Batching:");
48968
+ console.log(`- Catalog status: ${status}${surface ? ` (${surface})` : ""}`);
48969
+ if (operation) console.log(`- Batch operation: ${operation}`);
48970
+ if (maxBatchSize !== null) {
48971
+ console.log(`- Maximum batch size: ${maxBatchSize} items`);
48972
+ }
48973
+ if (status === "compiled") {
48974
+ console.log(
48975
+ "- Compatible per-row Play calls can coalesce; separate tools execute requests do not coalesce."
48976
+ );
48977
+ } else if (surface !== "docs") {
48978
+ console.log(
48979
+ "- Play does not automatically coalesce per-row calls for this operation; send a native batch as one request when its input schema supports one."
48980
+ );
48981
+ }
48982
+ if (notes) console.log(`- Details: ${notes}`);
48983
+ }
48984
+ const configuredRateLimits = arrayField2(
48985
+ executionMetadata,
48986
+ "configuredRateLimits",
48987
+ "configured_rate_limits"
48988
+ ).filter(isRecord12);
48989
+ if (configuredRateLimits.length > 0) {
48990
+ console.log("");
48991
+ console.log(
48992
+ "Configured Deepline pacing (guidance, not a guaranteed provider quota):"
48993
+ );
48994
+ for (const limit of configuredRateLimits) {
48995
+ const requests = numberField2(limit, "requestsPerWindow");
48996
+ const windowMs = numberField2(limit, "windowMs");
48997
+ if (requests === null || windowMs === null) continue;
48998
+ const usage = stringField2(limit, "usage") || "unknown";
48999
+ const usageText = usage === "queue_hint" ? "queue hint" : usage === "enforced" ? "Deepline enforced" : usage === "queue_hint_and_enforced" ? "queue hint and Deepline enforced" : usage === "disabled" ? "disabled" : usage;
49000
+ const explicitMaxConcurrency = numberField2(
49001
+ limit,
49002
+ "explicitMaxConcurrency",
49003
+ "explicit_max_concurrency"
49004
+ );
49005
+ const concurrencyText = explicitMaxConcurrency === null ? "no explicit concurrency limit" : `explicit concurrency limit ${explicitMaxConcurrency}`;
49006
+ console.log(
49007
+ `- ${requests} requests per ${formatRateWindow(windowMs)} (${usageText}; ${concurrencyText})`
49008
+ );
49009
+ }
49010
+ }
49011
+ const queueHint = recordField2(executionMetadata, "queueHint", "queue_hint");
49012
+ const requestsPerSecondHint = numberField2(
49013
+ queueHint,
49014
+ "requestsPerSecondHint",
49015
+ "requests_per_second_hint"
49016
+ );
49017
+ const derivedConcurrency = numberField2(
49018
+ queueHint,
49019
+ "derivedConcurrency",
49020
+ "derived_concurrency"
49021
+ );
49022
+ if (requestsPerSecondHint !== null && requestsPerSecondHint > 0 && derivedConcurrency !== null) {
49023
+ console.log(
49024
+ `Derived runtime queue hint: ${requestsPerSecondHint} requests/second; ${derivedConcurrency} derived concurrency. This is not an observed provider concurrency limit.`
49025
+ );
49026
+ }
49027
+ }
49028
+ function formatRateWindow(windowMs) {
49029
+ if (windowMs === 1e3) return "second";
49030
+ if (windowMs === 6e4) return "minute";
49031
+ if (windowMs === 36e5) return "hour";
49032
+ return `${windowMs}ms`;
49033
+ }
48806
49034
  function printSamples(samples) {
48807
49035
  const requestPayload = samplePayload(samples, "request");
48808
49036
  const responsePayload = samplePayload(samples, "response");
@@ -50789,6 +51017,8 @@ Examples:
50789
51017
  printJsonError(error);
50790
51018
  } else if (error instanceof Error) {
50791
51019
  console.error(`Error: ${error.message}`);
51020
+ const providerConcurrency = formatProviderConcurrencyDiagnostic(error);
51021
+ if (providerConcurrency) console.error(providerConcurrency);
50792
51022
  } else {
50793
51023
  console.error(`Error: ${String(error)}`);
50794
51024
  }