@adcp/sdk 14.0.0 → 14.2.0

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 (234) hide show
  1. package/dist/lib/adapters/implicit-account-store.d.mts +12 -7
  2. package/dist/lib/adapters/implicit-account-store.d.ts +12 -7
  3. package/dist/lib/adapters/implicit-account-store.js +69 -15
  4. package/dist/lib/adapters/implicit-account-store.mjs +69 -15
  5. package/dist/lib/core/AgentClient.d.mts +1 -0
  6. package/dist/lib/core/AgentClient.d.ts +1 -0
  7. package/dist/lib/core/AgentClient.js +3 -0
  8. package/dist/lib/core/AgentClient.mjs +3 -0
  9. package/dist/lib/core/SingleAgentClient.d.mts +35 -2
  10. package/dist/lib/core/SingleAgentClient.d.ts +35 -2
  11. package/dist/lib/core/SingleAgentClient.js +377 -36
  12. package/dist/lib/core/SingleAgentClient.mjs +387 -38
  13. package/dist/lib/core/TaskExecutor.d.mts +3 -1
  14. package/dist/lib/core/TaskExecutor.d.ts +3 -1
  15. package/dist/lib/core/TaskExecutor.js +17 -12
  16. package/dist/lib/core/TaskExecutor.mjs +17 -12
  17. package/dist/lib/core/account-key.d.mts +3 -0
  18. package/dist/lib/core/account-key.d.ts +3 -0
  19. package/dist/lib/core/account-key.js +41 -0
  20. package/dist/lib/core/account-key.mjs +17 -0
  21. package/dist/lib/core/account-resolution.d.mts +2 -0
  22. package/dist/lib/core/account-resolution.d.ts +2 -0
  23. package/dist/lib/core/buyer-account-registry.d.mts +93 -0
  24. package/dist/lib/core/buyer-account-registry.d.ts +93 -0
  25. package/dist/lib/core/buyer-account-registry.js +602 -0
  26. package/dist/lib/core/buyer-account-registry.mjs +578 -0
  27. package/dist/lib/core/product-cache.d.mts +18 -0
  28. package/dist/lib/core/product-cache.d.ts +18 -0
  29. package/dist/lib/core/product-cache.js +137 -0
  30. package/dist/lib/core/product-cache.mjs +112 -0
  31. package/dist/lib/errors/index.d.mts +40 -1
  32. package/dist/lib/errors/index.d.ts +40 -1
  33. package/dist/lib/errors/index.js +69 -3
  34. package/dist/lib/errors/index.mjs +64 -3
  35. package/dist/lib/governance/authorization.d.mts +17 -1
  36. package/dist/lib/governance/authorization.d.ts +17 -1
  37. package/dist/lib/governance/authorization.js +55 -7
  38. package/dist/lib/governance/authorization.mjs +59 -7
  39. package/dist/lib/governance/index.d.mts +2 -2
  40. package/dist/lib/governance/index.d.ts +2 -2
  41. package/dist/lib/governance/index.js +2 -0
  42. package/dist/lib/governance/index.mjs +3 -1
  43. package/dist/lib/index.d.mts +7 -4
  44. package/dist/lib/index.d.ts +7 -4
  45. package/dist/lib/index.js +29 -0
  46. package/dist/lib/index.mjs +31 -1
  47. package/dist/lib/net/agent-transport-fetch.d.mts +4 -0
  48. package/dist/lib/net/agent-transport-fetch.d.ts +4 -0
  49. package/dist/lib/net/agent-transport-fetch.js +18 -5
  50. package/dist/lib/net/agent-transport-fetch.mjs +17 -5
  51. package/dist/lib/protocols/a2a.js +9 -1
  52. package/dist/lib/protocols/a2a.mjs +9 -1
  53. package/dist/lib/protocols/index.js +9 -2
  54. package/dist/lib/protocols/index.mjs +9 -2
  55. package/dist/lib/protocols/mcp-modern.js +2 -1
  56. package/dist/lib/protocols/mcp-modern.mjs +2 -1
  57. package/dist/lib/protocols/mcp.js +5 -2
  58. package/dist/lib/protocols/mcp.mjs +5 -2
  59. package/dist/lib/protocols/rawResponseCapture.d.mts +6 -0
  60. package/dist/lib/protocols/rawResponseCapture.d.ts +6 -0
  61. package/dist/lib/protocols/rawResponseCapture.js +41 -29
  62. package/dist/lib/protocols/rawResponseCapture.mjs +40 -29
  63. package/dist/lib/protocols/signedRequestRejection.d.mts +9 -0
  64. package/dist/lib/protocols/signedRequestRejection.d.ts +9 -0
  65. package/dist/lib/protocols/signedRequestRejection.js +209 -0
  66. package/dist/lib/protocols/signedRequestRejection.mjs +189 -0
  67. package/dist/lib/protocols/transportDiagnostics.d.mts +1 -0
  68. package/dist/lib/protocols/transportDiagnostics.d.ts +1 -0
  69. package/dist/lib/protocols/transportDiagnostics.js +2 -0
  70. package/dist/lib/protocols/transportDiagnostics.mjs +1 -0
  71. package/dist/lib/registry/types.generated.d.mts +112 -45
  72. package/dist/lib/registry/types.generated.d.ts +112 -45
  73. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  74. package/dist/lib/server/account-provisioning.d.mts +2 -0
  75. package/dist/lib/server/account-provisioning.d.ts +2 -0
  76. package/dist/lib/server/account-provisioning.js +30 -0
  77. package/dist/lib/server/account-provisioning.mjs +6 -0
  78. package/dist/lib/server/account-reference-warnings.d.mts +12 -0
  79. package/dist/lib/server/account-reference-warnings.d.ts +12 -0
  80. package/dist/lib/server/account-reference-warnings.js +48 -0
  81. package/dist/lib/server/account-reference-warnings.mjs +23 -0
  82. package/dist/lib/server/auth-signature.js +1 -0
  83. package/dist/lib/server/auth-signature.mjs +1 -0
  84. package/dist/lib/server/create-adcp-server.d.mts +34 -0
  85. package/dist/lib/server/create-adcp-server.d.ts +34 -0
  86. package/dist/lib/server/create-adcp-server.js +225 -14
  87. package/dist/lib/server/create-adcp-server.mjs +225 -14
  88. package/dist/lib/server/decisioning/account.d.mts +2 -0
  89. package/dist/lib/server/decisioning/account.d.ts +2 -0
  90. package/dist/lib/server/decisioning/runtime/from-platform.js +49 -10
  91. package/dist/lib/server/decisioning/runtime/from-platform.mjs +49 -10
  92. package/dist/lib/server/index.d.mts +2 -2
  93. package/dist/lib/server/index.d.ts +2 -2
  94. package/dist/lib/server/index.js +2 -0
  95. package/dist/lib/server/index.mjs +3 -1
  96. package/dist/lib/signing/agent-resolver/consistency.d.mts +6 -13
  97. package/dist/lib/signing/agent-resolver/consistency.d.ts +6 -13
  98. package/dist/lib/signing/agent-resolver/consistency.js +0 -1
  99. package/dist/lib/signing/agent-resolver/consistency.mjs +0 -1
  100. package/dist/lib/signing/agent-resolver/errors.d.mts +3 -1
  101. package/dist/lib/signing/agent-resolver/errors.d.ts +3 -1
  102. package/dist/lib/signing/agent-resolver/errors.js +6 -0
  103. package/dist/lib/signing/agent-resolver/errors.mjs +6 -0
  104. package/dist/lib/signing/agent-resolver/fetch-helpers.d.mts +11 -0
  105. package/dist/lib/signing/agent-resolver/fetch-helpers.d.ts +11 -0
  106. package/dist/lib/signing/agent-resolver/fetch-helpers.js +37 -2
  107. package/dist/lib/signing/agent-resolver/fetch-helpers.mjs +40 -3
  108. package/dist/lib/signing/agent-resolver/jwks-set.js +24 -3
  109. package/dist/lib/signing/agent-resolver/jwks-set.mjs +24 -3
  110. package/dist/lib/signing/agent-resolver/legacy-brand.d.mts +15 -0
  111. package/dist/lib/signing/agent-resolver/legacy-brand.d.ts +15 -0
  112. package/dist/lib/signing/agent-resolver/legacy-brand.js +60 -0
  113. package/dist/lib/signing/agent-resolver/legacy-brand.mjs +36 -0
  114. package/dist/lib/signing/agent-resolver/operator-authorization.d.mts +13 -0
  115. package/dist/lib/signing/agent-resolver/operator-authorization.d.ts +13 -0
  116. package/dist/lib/signing/agent-resolver/operator-authorization.js +108 -0
  117. package/dist/lib/signing/agent-resolver/operator-authorization.mjs +84 -0
  118. package/dist/lib/signing/agent-resolver/resolve-agent.d.mts +14 -4
  119. package/dist/lib/signing/agent-resolver/resolve-agent.d.ts +14 -4
  120. package/dist/lib/signing/agent-resolver/resolve-agent.js +148 -137
  121. package/dist/lib/signing/agent-resolver/resolve-agent.mjs +157 -139
  122. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +7 -1
  123. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +7 -1
  124. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +50 -17
  125. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +50 -17
  126. package/dist/lib/signing/agent-resolver/select-agent.d.mts +14 -15
  127. package/dist/lib/signing/agent-resolver/select-agent.d.ts +14 -15
  128. package/dist/lib/signing/agent-resolver/select-agent.js +98 -13
  129. package/dist/lib/signing/agent-resolver/select-agent.mjs +95 -13
  130. package/dist/lib/signing/brand-jwks.d.mts +29 -75
  131. package/dist/lib/signing/brand-jwks.d.ts +29 -75
  132. package/dist/lib/signing/brand-jwks.js +120 -182
  133. package/dist/lib/signing/brand-jwks.mjs +120 -182
  134. package/dist/lib/signing/errors.d.mts +7 -3
  135. package/dist/lib/signing/errors.d.ts +7 -3
  136. package/dist/lib/signing/errors.js +7 -2
  137. package/dist/lib/signing/errors.mjs +7 -2
  138. package/dist/lib/signing/jwks-https.d.mts +7 -0
  139. package/dist/lib/signing/jwks-https.d.ts +7 -0
  140. package/dist/lib/signing/jwks-https.js +31 -8
  141. package/dist/lib/signing/jwks-https.mjs +31 -8
  142. package/dist/lib/signing/jwks.d.mts +8 -0
  143. package/dist/lib/signing/jwks.d.ts +8 -0
  144. package/dist/lib/signing/middleware.js +2 -1
  145. package/dist/lib/signing/middleware.mjs +2 -1
  146. package/dist/lib/signing/publisher-pins.d.mts +11 -0
  147. package/dist/lib/signing/publisher-pins.d.ts +11 -0
  148. package/dist/lib/signing/publisher-pins.js +125 -0
  149. package/dist/lib/signing/publisher-pins.mjs +101 -0
  150. package/dist/lib/signing/server.d.mts +1 -0
  151. package/dist/lib/signing/server.d.ts +1 -0
  152. package/dist/lib/signing/types.d.mts +5 -0
  153. package/dist/lib/signing/types.d.ts +5 -0
  154. package/dist/lib/signing/verifier.js +50 -5
  155. package/dist/lib/signing/verifier.mjs +50 -5
  156. package/dist/lib/signing/webhook-verifier.d.mts +7 -2
  157. package/dist/lib/signing/webhook-verifier.d.ts +7 -2
  158. package/dist/lib/signing/webhook-verifier.js +42 -2
  159. package/dist/lib/signing/webhook-verifier.mjs +42 -2
  160. package/dist/lib/testing/storyboard/account-policy.d.mts +2 -0
  161. package/dist/lib/testing/storyboard/account-policy.d.ts +2 -0
  162. package/dist/lib/testing/storyboard/account-policy.js +35 -0
  163. package/dist/lib/testing/storyboard/account-policy.mjs +11 -0
  164. package/dist/lib/testing/storyboard/context.js +6 -0
  165. package/dist/lib/testing/storyboard/context.mjs +6 -0
  166. package/dist/lib/testing/storyboard/request-builder.js +12 -2
  167. package/dist/lib/testing/storyboard/request-builder.mjs +12 -2
  168. package/dist/lib/testing/storyboard/runner.js +3 -2
  169. package/dist/lib/testing/storyboard/runner.mjs +3 -2
  170. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  171. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  172. package/dist/lib/types/accept-proposal.d.ts +19 -1
  173. package/dist/lib/types/buy-products.d.ts +19 -1
  174. package/dist/lib/types/check-governance.d.ts +19 -1
  175. package/dist/lib/types/comply-test-controller.d.ts +19 -1
  176. package/dist/lib/types/control-media-buy.d.ts +19 -1
  177. package/dist/lib/types/core.generated.d.mts +14 -1
  178. package/dist/lib/types/core.generated.d.ts +14 -1
  179. package/dist/lib/types/create-media-buy.d.ts +14 -1
  180. package/dist/lib/types/get-media-buys.d.ts +14 -1
  181. package/dist/lib/types/get-products.d.ts +19 -1
  182. package/dist/lib/types/list-products.d.ts +19 -1
  183. package/dist/lib/types/refine-proposals.d.ts +19 -1
  184. package/dist/lib/types/request-proposals.d.ts +19 -1
  185. package/dist/lib/types/schemas.generated.d.ts +12 -3
  186. package/dist/lib/types/schemas.generated.js +4 -1
  187. package/dist/lib/types/schemas.generated.mjs +4 -1
  188. package/dist/lib/types/tools.generated.d.mts +14 -1
  189. package/dist/lib/types/tools.generated.d.ts +14 -1
  190. package/dist/lib/types/update-media-buy.d.ts +14 -1
  191. package/dist/lib/version.d.mts +3 -3
  192. package/dist/lib/version.d.ts +3 -3
  193. package/dist/lib/version.js +3 -3
  194. package/dist/lib/version.mjs +3 -3
  195. package/dist/lib/webhooks/index.d.mts +24 -0
  196. package/dist/lib/webhooks/index.d.ts +24 -0
  197. package/dist/lib/webhooks/index.js +50 -24
  198. package/dist/lib/webhooks/index.mjs +49 -24
  199. package/dist/lib/wholesale-feed-sync/index.d.mts +2 -0
  200. package/dist/lib/wholesale-feed-sync/index.d.ts +2 -0
  201. package/dist/lib/wholesale-feed-sync/index.js +7 -0
  202. package/dist/lib/wholesale-feed-sync/index.mjs +4 -0
  203. package/dist/lib/wholesale-feed-sync/mirror.d.mts +97 -0
  204. package/dist/lib/wholesale-feed-sync/mirror.d.ts +97 -0
  205. package/dist/lib/wholesale-feed-sync/mirror.js +350 -0
  206. package/dist/lib/wholesale-feed-sync/mirror.mjs +322 -0
  207. package/dist/lib/wholesale-feed-sync/sync.d.mts +13 -29
  208. package/dist/lib/wholesale-feed-sync/sync.d.ts +13 -29
  209. package/dist/lib/wholesale-feed-sync/sync.js +208 -281
  210. package/dist/lib/wholesale-feed-sync/sync.mjs +213 -281
  211. package/dist/lib/wholesale-feed-sync/types.d.mts +4 -3
  212. package/dist/lib/wholesale-feed-sync/types.d.ts +4 -3
  213. package/docs/README.md +6 -0
  214. package/docs/TYPE-SUMMARY.md +2 -2
  215. package/docs/guides/BUILD-AN-AGENT.md +2 -2
  216. package/docs/guides/BUYER-QUICKSTART-3.2.md +2 -0
  217. package/docs/guides/BUYER-STORAGE.md +3 -0
  218. package/docs/guides/FIRST-CALL-TO-A-SELLER.md +106 -0
  219. package/docs/guides/SIGNING-GUIDE.md +16 -7
  220. package/docs/guides/account-resolution.md +132 -10
  221. package/docs/llms.txt +3 -2
  222. package/docs/migration-14.0-to-14.1.md +85 -0
  223. package/docs/migration-14.x-rc-worksheet.md +4 -4
  224. package/docs/migration-4.x-to-5.x.md +1 -0
  225. package/docs/migration-agent-resolution-3.3.md +125 -0
  226. package/docs/recipes/verifying-inbound-webhooks.md +60 -15
  227. package/package.json +3 -2
  228. package/skills/adcp-brand.previous/SKILL.md +0 -200
  229. package/skills/adcp-creative.previous/SKILL.md +0 -305
  230. package/skills/adcp-governance.previous/SKILL.md +0 -566
  231. package/skills/adcp-measurement.previous/SKILL.md +0 -136
  232. package/skills/adcp-media-buy.previous/SKILL.md +0 -556
  233. package/skills/adcp-si.previous/SKILL.md +0 -206
  234. package/skills/adcp-signals.previous/SKILL.md +0 -204
@@ -53,6 +53,7 @@ import {
53
53
  import { hasValidatedMcpAuthorizationRequirements } from "../auth/oauth/authorization-required.mjs";
54
54
  import { getNonInteractiveOAuthProvider } from "../auth/oauth/provider-cache.mjs";
55
55
  import { AuthenticationCredentialsRejectedError, is401Error } from "../errors/index.mjs";
56
+ import { getSignedRequestRejection } from "./signedRequestRejection.mjs";
56
57
  import { isLikelyPrivateUrl } from "../net/index.mjs";
57
58
  import { validateAgentUrl } from "../validation/index.mjs";
58
59
  import { withSpan } from "../observability/tracing.mjs";
@@ -349,7 +350,7 @@ class ProtocolClient {
349
350
  }
350
351
  );
351
352
  } catch (err) {
352
- if (agent.oauth_client_credentials && is401Error(err)) {
353
+ if (agent.oauth_client_credentials && is401Error(err) && getSignedRequestRejection(err)?.challenge?.scheme !== "signature") {
353
354
  const ccStorage = getAgentStorage(agent);
354
355
  const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);
355
356
  await ensureClientCredentialsTokens(agent, {
@@ -381,6 +382,8 @@ class ProtocolClient {
381
382
  }
382
383
  );
383
384
  } catch (retryErr) {
385
+ const rejection = getSignedRequestRejection(retryErr) ?? (is401Error(retryErr) ? getSignedRequestRejection(err) : void 0);
386
+ if (rejection) throw rejection;
384
387
  await rethrowAsNeedsAuthorization(
385
388
  retryErr,
386
389
  agent.agent_uri,
@@ -421,7 +424,7 @@ class ProtocolClient {
421
424
  transport?.legacyCompat
422
425
  );
423
426
  } catch (err) {
424
- if (agent.oauth_client_credentials && is401Error(err)) {
427
+ if (agent.oauth_client_credentials && is401Error(err) && getSignedRequestRejection(err)?.challenge?.scheme !== "signature") {
425
428
  const ccStorage = getAgentStorage(agent);
426
429
  const allowPrivateIp = transport?.allowPrivateIp ?? isLikelyPrivateUrl(agent.agent_uri);
427
430
  await ensureClientCredentialsTokens(agent, {
@@ -450,6 +453,8 @@ class ProtocolClient {
450
453
  transport?.legacyCompat
451
454
  );
452
455
  } catch (retryErr) {
456
+ const rejection = getSignedRequestRejection(retryErr) ?? (is401Error(retryErr) ? getSignedRequestRejection(err) : void 0);
457
+ if (rejection) throw rejection;
453
458
  await rethrowAsNeedsAuthorization(
454
459
  retryErr,
455
460
  agent.agent_uri,
@@ -481,6 +486,8 @@ class ProtocolClient {
481
486
  }
482
487
  }
483
488
  async function rethrowAsNeedsAuthorization(err, agentUrl, fetchFn, signal, configuredAllowPrivateIp, recoveryMode = "discover") {
489
+ const signedRejection = getSignedRequestRejection(err);
490
+ if (signedRejection) throw signedRejection;
484
491
  if (err instanceof NeedsAuthorizationError) throw err;
485
492
  if (!is401Error(err)) return;
486
493
  if (recoveryMode === "static") {
@@ -34,6 +34,7 @@ var import_session_termination = require('./session-termination.js');
34
34
  var import_client2 = require('../signing/client.js');
35
35
  var import_abort = require('./abort.js');
36
36
  var import_rawResponseCapture = require('./rawResponseCapture.js');
37
+ var import_signedRequestRejection = require('./signedRequestRejection.js');
37
38
  var import_responseSizeLimit = require('./responseSizeLimit.js');
38
39
  var import_transportDiagnostics = require('./transportDiagnostics.js');
39
40
  var import_agent_transport_fetch = require('../net/agent-transport-fetch.js');
@@ -228,7 +229,7 @@ async function createNegotiatedClient(cacheKey, options, authHeaders, useCachedD
228
229
  const networkFetch = (input, init) => (0, import_abort.withAbortSignal)([init?.signal], requestTimeoutMs, (signal) => rawNetworkFetch(input, { ...init, signal }));
229
230
  const diagnosticFetch = (0, import_transportDiagnostics.wrapFetchWithTransportDiagnostics)((0, import_responseSizeLimit.wrapFetchWithSizeLimit)(networkFetch));
230
231
  const signedFetch = options.signingContext ? (0, import_client2.buildAgentSigningFetch)({
231
- upstream: diagnosticFetch,
232
+ upstream: (0, import_signedRequestRejection.wrapFetchWithSignedRequestRejection)(diagnosticFetch, options.agentUrl),
232
233
  signing: options.signingContext.signing,
233
234
  getCapability: options.signingContext.getCapability,
234
235
  adcpVersion: options.signingContext.adcpVersion
@@ -28,6 +28,7 @@ import {
28
28
  withAbortSignal
29
29
  } from "./abort.mjs";
30
30
  import { wrapFetchWithCapture } from "./rawResponseCapture.mjs";
31
+ import { wrapFetchWithSignedRequestRejection } from "./signedRequestRejection.mjs";
31
32
  import { wrapFetchWithSizeLimit } from "./responseSizeLimit.mjs";
32
33
  import { wrapFetchWithTransportDiagnostics } from "./transportDiagnostics.mjs";
33
34
  import { createAgentTransportFetch } from "../net/agent-transport-fetch.mjs";
@@ -222,7 +223,7 @@ async function createNegotiatedClient(cacheKey, options, authHeaders, useCachedD
222
223
  const networkFetch = (input, init) => withAbortSignal([init?.signal], requestTimeoutMs, (signal) => rawNetworkFetch(input, { ...init, signal }));
223
224
  const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));
224
225
  const signedFetch = options.signingContext ? buildAgentSigningFetch({
225
- upstream: diagnosticFetch,
226
+ upstream: wrapFetchWithSignedRequestRejection(diagnosticFetch, options.agentUrl),
226
227
  signing: options.signingContext.signing,
227
228
  getCapability: options.signingContext.getCapability,
228
229
  adcpVersion: options.signingContext.adcpVersion
@@ -40,6 +40,7 @@ var import_tracing = require('../observability/tracing.js');
40
40
  var import_client2 = require('../signing/client.js');
41
41
  var import_redact_args = require('../utils/redact-args.js');
42
42
  var import_rawResponseCapture = require('./rawResponseCapture.js');
43
+ var import_signedRequestRejection = require('./signedRequestRejection.js');
43
44
  var import_responseSizeLimit = require('./responseSizeLimit.js');
44
45
  var import_transportDiagnostics = require('./transportDiagnostics.js');
45
46
  var import_abort = require('./abort.js');
@@ -482,7 +483,7 @@ async function connectMCPWithFallbackImpl(url, authHeaders, debugLogs = [], labe
482
483
  const sizeLimited = (0, import_responseSizeLimit.wrapFetchWithSizeLimit)(networkFetch);
483
484
  const diagnosticFetch = (0, import_transportDiagnostics.wrapFetchWithTransportDiagnostics)(sizeLimited);
484
485
  const baseFetch = signingContext ? (0, import_client2.buildAgentSigningFetch)({
485
- upstream: diagnosticFetch,
486
+ upstream: (0, import_signedRequestRejection.wrapFetchWithSignedRequestRejection)(diagnosticFetch, url.toString()),
486
487
  signing: signingContext.signing,
487
488
  getCapability: signingContext.getCapability,
488
489
  adcpVersion: signingContext.adcpVersion
@@ -771,7 +772,7 @@ async function connectMCP(options) {
771
772
  );
772
773
  const diagnosticFetch = (0, import_transportDiagnostics.wrapFetchWithTransportDiagnostics)(sizeLimited);
773
774
  const signedFetch = signingContext ? (0, import_client2.buildAgentSigningFetch)({
774
- upstream: diagnosticFetch,
775
+ upstream: (0, import_signedRequestRejection.wrapFetchWithSignedRequestRejection)(diagnosticFetch, agentUrl),
775
776
  signing: signingContext.signing,
776
777
  getCapability: signingContext.getCapability,
777
778
  adcpVersion: signingContext.adcpVersion
@@ -788,6 +789,8 @@ async function connectMCP(options) {
788
789
  });
789
790
  return { client: mcpClient, transport };
790
791
  } catch (error) {
792
+ const signedRejection = (0, import_signedRequestRejection.getSignedRequestRejection)(error);
793
+ if (signedRejection) throw signedRejection;
791
794
  if (authProvider && error instanceof import_auth.UnauthorizedError) {
792
795
  debugLogs.push({
793
796
  type: "info",
@@ -17,6 +17,7 @@ import { withSpan, injectTraceHeaders } from "../observability/tracing.mjs";
17
17
  import { buildAgentSigningFetch, signingContextStorage } from "../signing/client.mjs";
18
18
  import { redactArgsForLog } from "../utils/redact-args.mjs";
19
19
  import { wrapFetchWithCapture } from "./rawResponseCapture.mjs";
20
+ import { getSignedRequestRejection, wrapFetchWithSignedRequestRejection } from "./signedRequestRejection.mjs";
20
21
  import { wrapFetchWithSizeLimit } from "./responseSizeLimit.mjs";
21
22
  import { sanitizeTransportUrl, wrapFetchWithTransportDiagnostics } from "./transportDiagnostics.mjs";
22
23
  import {
@@ -469,7 +470,7 @@ async function connectMCPWithFallbackImpl(url, authHeaders, debugLogs = [], labe
469
470
  const sizeLimited = wrapFetchWithSizeLimit(networkFetch);
470
471
  const diagnosticFetch = wrapFetchWithTransportDiagnostics(sizeLimited);
471
472
  const baseFetch = signingContext ? buildAgentSigningFetch({
472
- upstream: diagnosticFetch,
473
+ upstream: wrapFetchWithSignedRequestRejection(diagnosticFetch, url.toString()),
473
474
  signing: signingContext.signing,
474
475
  getCapability: signingContext.getCapability,
475
476
  adcpVersion: signingContext.adcpVersion
@@ -758,7 +759,7 @@ async function connectMCP(options) {
758
759
  );
759
760
  const diagnosticFetch = wrapFetchWithTransportDiagnostics(sizeLimited);
760
761
  const signedFetch = signingContext ? buildAgentSigningFetch({
761
- upstream: diagnosticFetch,
762
+ upstream: wrapFetchWithSignedRequestRejection(diagnosticFetch, agentUrl),
762
763
  signing: signingContext.signing,
763
764
  getCapability: signingContext.getCapability,
764
765
  adcpVersion: signingContext.adcpVersion
@@ -775,6 +776,8 @@ async function connectMCP(options) {
775
776
  });
776
777
  return { client: mcpClient, transport };
777
778
  } catch (error) {
779
+ const signedRejection = getSignedRequestRejection(error);
780
+ if (signedRejection) throw signedRejection;
778
781
  if (authProvider && error instanceof UnauthorizedError) {
779
782
  debugLogs.push({
780
783
  type: "info",
@@ -55,4 +55,10 @@ export declare function getCapturesFromError(err: unknown): RawHttpCapture[] | u
55
55
  * slot is set.
56
56
  */
57
57
  export declare function wrapFetchWithCapture(upstream: typeof fetch): typeof fetch;
58
+ /** Record an already bounded response without cloning or reading its stream. */
59
+ export declare function recordRawResponseCapture(input: RequestInfo | URL, init: RequestInit | undefined, response: Response, body: string, bodyTruncated: boolean, startedAt: number, safeMetadata?: {
60
+ url?: string;
61
+ headers?: Record<string, string>;
62
+ latencyMs?: number;
63
+ }): void;
58
64
  export {};
@@ -55,4 +55,10 @@ export declare function getCapturesFromError(err: unknown): RawHttpCapture[] | u
55
55
  * slot is set.
56
56
  */
57
57
  export declare function wrapFetchWithCapture(upstream: typeof fetch): typeof fetch;
58
+ /** Record an already bounded response without cloning or reading its stream. */
59
+ export declare function recordRawResponseCapture(input: RequestInfo | URL, init: RequestInit | undefined, response: Response, body: string, bodyTruncated: boolean, startedAt: number, safeMetadata?: {
60
+ url?: string;
61
+ headers?: Record<string, string>;
62
+ latencyMs?: number;
63
+ }): void;
58
64
  export {};
@@ -21,6 +21,7 @@ __export(rawResponseCapture_exports, {
21
21
  getCaptureOverflowFromError: () => getCaptureOverflowFromError,
22
22
  getCapturesFromError: () => getCapturesFromError,
23
23
  rawResponseCaptureStorage: () => rawResponseCaptureStorage,
24
+ recordRawResponseCapture: () => recordRawResponseCapture,
24
25
  withRawResponseCapture: () => withRawResponseCapture,
25
26
  wrapFetchWithCapture: () => wrapFetchWithCapture
26
27
  });
@@ -88,44 +89,54 @@ function wrapFetchWithCapture(upstream) {
88
89
  const wrapped = async (input, init) => {
89
90
  const slot = rawResponseCaptureStorage.getStore();
90
91
  if (!slot) return upstream(input, init);
91
- const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
92
- const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
93
- const requestMetadata = extractSafeRequestMetadata(init?.body, slot.maxBodyBytes);
94
92
  const startedAt = Date.now();
95
93
  const response = await upstream(input, init);
96
94
  const latencyMs = Date.now() - startedAt;
97
95
  const cloneForRead = response.clone();
98
96
  const { body, bodyTruncated } = await readBodyBounded(cloneForRead, slot.maxBodyBytes);
99
- const headers = {};
100
- response.headers.forEach((value, key) => {
101
- const lower = key.toLowerCase();
102
- headers[key] = REDACTED_HEADER_NAMES.has(lower) ? REDACTED_PLACEHOLDER : value;
103
- });
104
- if (slot.maxCaptures !== void 0 && slot.captures.length >= slot.maxCaptures) {
105
- slot.overflowed ??= "captures";
106
- return response;
107
- }
108
- const redactedBody = redactBearerInBody(body);
109
- if (slot.maxTotalBodyBytes !== void 0 && slot.totalBodyBytes + redactedBody.length > slot.maxTotalBodyBytes) {
110
- slot.overflowed ??= "bytes";
111
- return response;
112
- }
113
- slot.totalBodyBytes += redactedBody.length;
114
- slot.captures.push({
115
- url,
116
- method,
117
- ...requestMetadata,
118
- status: response.status,
119
- headers,
120
- body: redactedBody,
121
- latencyMs,
122
- timestamp: new Date(startedAt).toISOString(),
123
- bodyTruncated
124
- });
97
+ recordRawResponseCapture(input, init, response, body, bodyTruncated, startedAt, { latencyMs });
125
98
  return response;
126
99
  };
127
100
  return wrapped;
128
101
  }
102
+ function recordRawResponseCapture(input, init, response, body, bodyTruncated, startedAt, safeMetadata) {
103
+ const slot = rawResponseCaptureStorage.getStore();
104
+ if (!slot) return;
105
+ const url = safeMetadata?.url ?? (typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url);
106
+ const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
107
+ const requestMetadata = extractSafeRequestMetadata(init?.body, slot.maxBodyBytes);
108
+ const latencyMs = safeMetadata?.latencyMs ?? Date.now() - startedAt;
109
+ if (body.length > slot.maxBodyBytes) {
110
+ body = body.slice(0, slot.maxBodyBytes);
111
+ bodyTruncated = true;
112
+ }
113
+ const headers = {};
114
+ response.headers.forEach((value, key) => {
115
+ const lower = key.toLowerCase();
116
+ headers[key] = REDACTED_HEADER_NAMES.has(lower) ? REDACTED_PLACEHOLDER : value;
117
+ });
118
+ if (slot.maxCaptures !== void 0 && slot.captures.length >= slot.maxCaptures) {
119
+ slot.overflowed ??= "captures";
120
+ return;
121
+ }
122
+ const redactedBody = redactBearerInBody(body);
123
+ if (slot.maxTotalBodyBytes !== void 0 && slot.totalBodyBytes + redactedBody.length > slot.maxTotalBodyBytes) {
124
+ slot.overflowed ??= "bytes";
125
+ return;
126
+ }
127
+ slot.totalBodyBytes += redactedBody.length;
128
+ slot.captures.push({
129
+ url,
130
+ method,
131
+ ...requestMetadata,
132
+ status: response.status,
133
+ headers: safeMetadata?.headers ?? headers,
134
+ body: redactedBody,
135
+ latencyMs,
136
+ timestamp: new Date(startedAt).toISOString(),
137
+ bodyTruncated
138
+ });
139
+ }
129
140
  function extractSafeRequestMetadata(body, maxBodyBytes) {
130
141
  if (typeof body !== "string" || body.length > maxBodyBytes) return {};
131
142
  let parsed;
@@ -175,6 +186,7 @@ async function readBodyBounded(response, maxBodyBytes) {
175
186
  getCaptureOverflowFromError,
176
187
  getCapturesFromError,
177
188
  rawResponseCaptureStorage,
189
+ recordRawResponseCapture,
178
190
  withRawResponseCapture,
179
191
  wrapFetchWithCapture
180
192
  });
@@ -66,44 +66,54 @@ function wrapFetchWithCapture(upstream) {
66
66
  const wrapped = async (input, init) => {
67
67
  const slot = rawResponseCaptureStorage.getStore();
68
68
  if (!slot) return upstream(input, init);
69
- const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
70
- const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
71
- const requestMetadata = extractSafeRequestMetadata(init?.body, slot.maxBodyBytes);
72
69
  const startedAt = Date.now();
73
70
  const response = await upstream(input, init);
74
71
  const latencyMs = Date.now() - startedAt;
75
72
  const cloneForRead = response.clone();
76
73
  const { body, bodyTruncated } = await readBodyBounded(cloneForRead, slot.maxBodyBytes);
77
- const headers = {};
78
- response.headers.forEach((value, key) => {
79
- const lower = key.toLowerCase();
80
- headers[key] = REDACTED_HEADER_NAMES.has(lower) ? REDACTED_PLACEHOLDER : value;
81
- });
82
- if (slot.maxCaptures !== void 0 && slot.captures.length >= slot.maxCaptures) {
83
- slot.overflowed ??= "captures";
84
- return response;
85
- }
86
- const redactedBody = redactBearerInBody(body);
87
- if (slot.maxTotalBodyBytes !== void 0 && slot.totalBodyBytes + redactedBody.length > slot.maxTotalBodyBytes) {
88
- slot.overflowed ??= "bytes";
89
- return response;
90
- }
91
- slot.totalBodyBytes += redactedBody.length;
92
- slot.captures.push({
93
- url,
94
- method,
95
- ...requestMetadata,
96
- status: response.status,
97
- headers,
98
- body: redactedBody,
99
- latencyMs,
100
- timestamp: new Date(startedAt).toISOString(),
101
- bodyTruncated
102
- });
74
+ recordRawResponseCapture(input, init, response, body, bodyTruncated, startedAt, { latencyMs });
103
75
  return response;
104
76
  };
105
77
  return wrapped;
106
78
  }
79
+ function recordRawResponseCapture(input, init, response, body, bodyTruncated, startedAt, safeMetadata) {
80
+ const slot = rawResponseCaptureStorage.getStore();
81
+ if (!slot) return;
82
+ const url = safeMetadata?.url ?? (typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url);
83
+ const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
84
+ const requestMetadata = extractSafeRequestMetadata(init?.body, slot.maxBodyBytes);
85
+ const latencyMs = safeMetadata?.latencyMs ?? Date.now() - startedAt;
86
+ if (body.length > slot.maxBodyBytes) {
87
+ body = body.slice(0, slot.maxBodyBytes);
88
+ bodyTruncated = true;
89
+ }
90
+ const headers = {};
91
+ response.headers.forEach((value, key) => {
92
+ const lower = key.toLowerCase();
93
+ headers[key] = REDACTED_HEADER_NAMES.has(lower) ? REDACTED_PLACEHOLDER : value;
94
+ });
95
+ if (slot.maxCaptures !== void 0 && slot.captures.length >= slot.maxCaptures) {
96
+ slot.overflowed ??= "captures";
97
+ return;
98
+ }
99
+ const redactedBody = redactBearerInBody(body);
100
+ if (slot.maxTotalBodyBytes !== void 0 && slot.totalBodyBytes + redactedBody.length > slot.maxTotalBodyBytes) {
101
+ slot.overflowed ??= "bytes";
102
+ return;
103
+ }
104
+ slot.totalBodyBytes += redactedBody.length;
105
+ slot.captures.push({
106
+ url,
107
+ method,
108
+ ...requestMetadata,
109
+ status: response.status,
110
+ headers: safeMetadata?.headers ?? headers,
111
+ body: redactedBody,
112
+ latencyMs,
113
+ timestamp: new Date(startedAt).toISOString(),
114
+ bodyTruncated
115
+ });
116
+ }
107
117
  function extractSafeRequestMetadata(body, maxBodyBytes) {
108
118
  if (typeof body !== "string" || body.length > maxBodyBytes) return {};
109
119
  let parsed;
@@ -152,6 +162,7 @@ export {
152
162
  getCaptureOverflowFromError,
153
163
  getCapturesFromError,
154
164
  rawResponseCaptureStorage,
165
+ recordRawResponseCapture,
155
166
  withRawResponseCapture,
156
167
  wrapFetchWithCapture
157
168
  };
@@ -0,0 +1,9 @@
1
+ import { AuthenticationRequiredError } from '../errors/index.mjs';
2
+ /**
3
+ * Install below the SDK signer, on the actual outbound transport. Only a
4
+ * request carrying Signature is classified as signed; signing configuration
5
+ * alone says nothing about unsigned discovery/housekeeping calls.
6
+ */
7
+ export declare function wrapFetchWithSignedRequestRejection(upstream: typeof fetch, agentUrl?: string): typeof fetch;
8
+ /** Official clients may retain fetch failures under a transport error cause. */
9
+ export declare function getSignedRequestRejection(error: unknown): AuthenticationRequiredError | undefined;
@@ -0,0 +1,9 @@
1
+ import { AuthenticationRequiredError } from '../errors';
2
+ /**
3
+ * Install below the SDK signer, on the actual outbound transport. Only a
4
+ * request carrying Signature is classified as signed; signing configuration
5
+ * alone says nothing about unsigned discovery/housekeeping calls.
6
+ */
7
+ export declare function wrapFetchWithSignedRequestRejection(upstream: typeof fetch, agentUrl?: string): typeof fetch;
8
+ /** Official clients may retain fetch failures under a transport error cause. */
9
+ export declare function getSignedRequestRejection(error: unknown): AuthenticationRequiredError | undefined;
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var signedRequestRejection_exports = {};
20
+ __export(signedRequestRejection_exports, {
21
+ getSignedRequestRejection: () => getSignedRequestRejection,
22
+ wrapFetchWithSignedRequestRejection: () => wrapFetchWithSignedRequestRejection
23
+ });
24
+ module.exports = __toCommonJS(signedRequestRejection_exports);
25
+ var import_errors = require('../errors/index.js');
26
+ var import_enums = require('../types/enums.generated.js');
27
+ var import_diagnostics = require('../auth/oauth/diagnostics.js');
28
+ var import_transportDiagnostics = require('./transportDiagnostics.js');
29
+ var import_rawResponseCapture = require('./rawResponseCapture.js');
30
+ const CAPTURE_BYTES = 16 * 1024;
31
+ const EXCERPT_LENGTH = 2048;
32
+ const CAPTURE_TIMEOUT_MS = 1e3;
33
+ const PUBLIC_HEADERS = /* @__PURE__ */ new Set([
34
+ "accept",
35
+ "content-type",
36
+ "content-length",
37
+ "user-agent",
38
+ "host",
39
+ "a2a-version",
40
+ "a2a-extensions",
41
+ "adcp-version",
42
+ "mcp-protocol-version",
43
+ "mcp-session-id",
44
+ "traceparent",
45
+ "tracestate",
46
+ "signature",
47
+ "signature-input",
48
+ "content-digest"
49
+ ]);
50
+ function wrapFetchWithSignedRequestRejection(upstream, agentUrl) {
51
+ return async (input, init) => {
52
+ const startedAt = Date.now();
53
+ const response = await upstream(input, init);
54
+ const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : void 0));
55
+ if (response.status !== 401 || !headers.has("signature")) return response;
56
+ const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
57
+ const parsed = (0, import_diagnostics.parseWWWAuthenticate)(response.headers.get("www-authenticate"));
58
+ if (parsed && parsed.scheme !== "signature") return response;
59
+ const knownCode = parsed?.scheme === "signature" && parsed.error && Object.prototype.hasOwnProperty.call(import_enums.RequestSigningErrorCodeMetadata, parsed.error);
60
+ const challenge = parsed ? { scheme: parsed.scheme.slice(0, 64), ...knownCode && { error: parsed.error } } : void 0;
61
+ const secrets = getHeaderSecrets(headers);
62
+ const captured = await captureBody(response, secrets, init?.signal);
63
+ const captureHeaders = (0, import_transportDiagnostics.sanitizeTransportHeaders)(response.headers);
64
+ for (const key of Object.keys(captureHeaders)) {
65
+ captureHeaders[key] = redactReflected(captureHeaders[key], secrets);
66
+ }
67
+ if (parsed) captureHeaders["www-authenticate"] = knownCode ? `Signature error="${parsed.error}"` : "Signature";
68
+ (0, import_rawResponseCapture.recordRawResponseCapture)(input, init, response, captured?.body ?? "", captured?.truncated ?? true, startedAt, {
69
+ url: (0, import_transportDiagnostics.sanitizeTransportUrl)(url),
70
+ headers: captureHeaders
71
+ });
72
+ const body = captured?.body;
73
+ let excerpt = body;
74
+ if (body && body.length > EXCERPT_LENGTH) {
75
+ let end = EXCERPT_LENGTH - 1;
76
+ if (/[\uD800-\uDBFF]/.test(body[end - 1])) end--;
77
+ excerpt = body.slice(0, end) + "\u2026";
78
+ }
79
+ throw new import_errors.AuthenticationRequiredError((0, import_transportDiagnostics.sanitizeTransportUrl)(agentUrl ?? url), void 0, void 0, challenge, {
80
+ status: response.status,
81
+ responseBody: excerpt
82
+ });
83
+ };
84
+ }
85
+ function getSignedRequestRejection(error) {
86
+ const seen = /* @__PURE__ */ new Set();
87
+ while (error && typeof error === "object" && !seen.has(error)) {
88
+ seen.add(error);
89
+ if (error instanceof import_errors.AuthenticationRequiredError && error.requestSigned) return error;
90
+ error = error.cause;
91
+ }
92
+ return void 0;
93
+ }
94
+ function getHeaderSecrets(headers) {
95
+ const secrets = [];
96
+ headers.forEach((value, name) => {
97
+ if (value && !PUBLIC_HEADERS.has(name)) {
98
+ secrets.push(value);
99
+ if (/^(authorization|proxy-authorization)$/i.test(name)) {
100
+ const credential = value.replace(/^\S+\s+/, "");
101
+ if (credential) secrets.push(credential);
102
+ }
103
+ }
104
+ });
105
+ return secrets;
106
+ }
107
+ function redactReflected(value, secrets) {
108
+ const mask = new Uint8Array(value.length);
109
+ for (const secret of secrets) {
110
+ for (let from = 0; from < value.length; ) {
111
+ const at = value.indexOf(secret, from);
112
+ if (at < 0) break;
113
+ mask.fill(1, at, at + secret.length);
114
+ from = at + 1;
115
+ }
116
+ }
117
+ let out = "";
118
+ let cursor = 0;
119
+ for (let at = 0; at < value.length; ) {
120
+ if (!mask[at]) {
121
+ at++;
122
+ continue;
123
+ }
124
+ out += value.slice(cursor, at) + "[redacted]";
125
+ while (at < value.length && mask[at]) at++;
126
+ cursor = at;
127
+ }
128
+ return out + value.slice(cursor);
129
+ }
130
+ async function captureBody(response, secrets, signal) {
131
+ if (!response.body) return void 0;
132
+ const reader = response.body.getReader();
133
+ let timer;
134
+ let cancelled = false;
135
+ const cancel = () => {
136
+ cancelled = true;
137
+ void reader.cancel().catch(() => {
138
+ });
139
+ };
140
+ signal?.addEventListener("abort", cancel, { once: true });
141
+ if (signal?.aborted) cancel();
142
+ try {
143
+ return await Promise.race([
144
+ (async () => {
145
+ const chunks = [];
146
+ let bytes = 0;
147
+ while (true) {
148
+ const { value, done } = await reader.read();
149
+ if (done) break;
150
+ if (bytes + value.byteLength > CAPTURE_BYTES) {
151
+ return { body: "[seller response exceeds diagnostic capture limit]", truncated: true };
152
+ }
153
+ chunks.push(value);
154
+ bytes += value.byteLength;
155
+ }
156
+ if (cancelled) return void 0;
157
+ let text = Buffer.concat(chunks).toString("utf8");
158
+ const redact = (value) => redactReflected(value, secrets);
159
+ if (/^\s*[{["]/.test(text)) {
160
+ try {
161
+ const valueRedacted = JSON.stringify(
162
+ JSON.parse(text, (_key, value) => {
163
+ if (typeof value === "string") return redact(value);
164
+ if ((typeof value === "boolean" || value === null) && secrets.includes(String(value)))
165
+ return "[redacted]";
166
+ if (typeof value === "number" && secrets.some((secret) => /^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i.test(secret) && Number(secret) === value))
167
+ return "[redacted]";
168
+ return value;
169
+ })
170
+ );
171
+ text = JSON.stringify(
172
+ JSON.parse((0, import_transportDiagnostics.redactSensitiveJsonOrText)(valueRedacted), (_key, value) => {
173
+ if (value && typeof value === "object" && !Array.isArray(value)) {
174
+ const out = /* @__PURE__ */ Object.create(null);
175
+ for (const key of Object.keys(value)) out[redact(key)] = value[key];
176
+ return out;
177
+ }
178
+ return value;
179
+ })
180
+ );
181
+ } catch {
182
+ return { body: "[seller response is not valid diagnostic JSON]", truncated: true };
183
+ }
184
+ } else {
185
+ text = redact(text);
186
+ }
187
+ text = (0, import_transportDiagnostics.redactSensitiveJsonOrText)(text).replace(/[\u0000-\u001f\u007f]/g, " ");
188
+ return { body: text, truncated: false };
189
+ })(),
190
+ new Promise((resolve) => {
191
+ timer = setTimeout(() => {
192
+ cancel();
193
+ resolve(void 0);
194
+ }, CAPTURE_TIMEOUT_MS);
195
+ })
196
+ ]);
197
+ } catch {
198
+ return void 0;
199
+ } finally {
200
+ if (timer) clearTimeout(timer);
201
+ signal?.removeEventListener("abort", cancel);
202
+ cancel();
203
+ }
204
+ }
205
+ // Annotate the CommonJS export names for ESM import in node:
206
+ 0 && (module.exports = {
207
+ getSignedRequestRejection,
208
+ wrapFetchWithSignedRequestRejection
209
+ });