@adcp/sdk 6.1.0 → 6.3.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 (147) hide show
  1. package/dist/lib/adapters/legacy/v2-5/create_media_buy.d.ts +4 -0
  2. package/dist/lib/adapters/legacy/v2-5/create_media_buy.d.ts.map +1 -0
  3. package/dist/lib/adapters/legacy/v2-5/create_media_buy.js +10 -0
  4. package/dist/lib/adapters/legacy/v2-5/create_media_buy.js.map +1 -0
  5. package/dist/lib/adapters/legacy/v2-5/get_products.d.ts +9 -0
  6. package/dist/lib/adapters/legacy/v2-5/get_products.d.ts.map +1 -0
  7. package/dist/lib/adapters/legacy/v2-5/get_products.js +15 -0
  8. package/dist/lib/adapters/legacy/v2-5/get_products.js.map +1 -0
  9. package/dist/lib/adapters/legacy/v2-5/index.d.ts +35 -0
  10. package/dist/lib/adapters/legacy/v2-5/index.d.ts.map +1 -0
  11. package/dist/lib/adapters/legacy/v2-5/index.js +56 -0
  12. package/dist/lib/adapters/legacy/v2-5/index.js.map +1 -0
  13. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.d.ts +9 -0
  14. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.d.ts.map +1 -0
  15. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.js +15 -0
  16. package/dist/lib/adapters/legacy/v2-5/list_creative_formats.js.map +1 -0
  17. package/dist/lib/adapters/legacy/v2-5/preview_creative.d.ts +4 -0
  18. package/dist/lib/adapters/legacy/v2-5/preview_creative.d.ts.map +1 -0
  19. package/dist/lib/adapters/legacy/v2-5/preview_creative.js +10 -0
  20. package/dist/lib/adapters/legacy/v2-5/preview_creative.js.map +1 -0
  21. package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts +11 -0
  22. package/dist/lib/adapters/legacy/v2-5/sync_creatives.d.ts.map +1 -0
  23. package/dist/lib/adapters/legacy/v2-5/sync_creatives.js +16 -0
  24. package/dist/lib/adapters/legacy/v2-5/sync_creatives.js.map +1 -0
  25. package/dist/lib/adapters/legacy/v2-5/types.d.ts +40 -0
  26. package/dist/lib/adapters/legacy/v2-5/types.d.ts.map +1 -0
  27. package/dist/lib/adapters/legacy/v2-5/types.js +25 -0
  28. package/dist/lib/adapters/legacy/v2-5/types.js.map +1 -0
  29. package/dist/lib/adapters/legacy/v2-5/update_media_buy.d.ts +4 -0
  30. package/dist/lib/adapters/legacy/v2-5/update_media_buy.d.ts.map +1 -0
  31. package/dist/lib/adapters/legacy/v2-5/update_media_buy.js +12 -0
  32. package/dist/lib/adapters/legacy/v2-5/update_media_buy.js.map +1 -0
  33. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  34. package/dist/lib/core/ConversationTypes.d.ts +7 -0
  35. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  36. package/dist/lib/core/SingleAgentClient.d.ts +9 -14
  37. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  38. package/dist/lib/core/SingleAgentClient.js +96 -40
  39. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  40. package/dist/lib/core/TaskExecutor.d.ts +5 -0
  41. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  42. package/dist/lib/core/TaskExecutor.js +12 -1
  43. package/dist/lib/core/TaskExecutor.js.map +1 -1
  44. package/dist/lib/errors/index.d.ts +30 -0
  45. package/dist/lib/errors/index.d.ts.map +1 -1
  46. package/dist/lib/errors/index.js +36 -1
  47. package/dist/lib/errors/index.js.map +1 -1
  48. package/dist/lib/index.d.ts +4 -2
  49. package/dist/lib/index.d.ts.map +1 -1
  50. package/dist/lib/index.js +12 -8
  51. package/dist/lib/index.js.map +1 -1
  52. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  53. package/dist/lib/protocols/a2a.js +5 -1
  54. package/dist/lib/protocols/a2a.js.map +1 -1
  55. package/dist/lib/protocols/index.d.ts +53 -3
  56. package/dist/lib/protocols/index.d.ts.map +1 -1
  57. package/dist/lib/protocols/index.js +19 -8
  58. package/dist/lib/protocols/index.js.map +1 -1
  59. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  60. package/dist/lib/protocols/mcp.js +13 -5
  61. package/dist/lib/protocols/mcp.js.map +1 -1
  62. package/dist/lib/protocols/responseSizeLimit.d.ts +25 -0
  63. package/dist/lib/protocols/responseSizeLimit.d.ts.map +1 -0
  64. package/dist/lib/protocols/responseSizeLimit.js +141 -0
  65. package/dist/lib/protocols/responseSizeLimit.js.map +1 -0
  66. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  67. package/dist/lib/server/decisioning/account.d.ts +84 -16
  68. package/dist/lib/server/decisioning/account.d.ts.map +1 -1
  69. package/dist/lib/server/decisioning/account.js.map +1 -1
  70. package/dist/lib/server/decisioning/async-outcome.d.ts +16 -10
  71. package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -1
  72. package/dist/lib/server/decisioning/async-outcome.js +15 -56
  73. package/dist/lib/server/decisioning/async-outcome.js.map +1 -1
  74. package/dist/lib/server/decisioning/errors-typed.d.ts +10 -4
  75. package/dist/lib/server/decisioning/errors-typed.d.ts.map +1 -1
  76. package/dist/lib/server/decisioning/errors-typed.js +13 -29
  77. package/dist/lib/server/decisioning/errors-typed.js.map +1 -1
  78. package/dist/lib/server/decisioning/helpers.d.ts.map +1 -1
  79. package/dist/lib/server/decisioning/helpers.js +0 -2
  80. package/dist/lib/server/decisioning/helpers.js.map +1 -1
  81. package/dist/lib/server/decisioning/index.d.ts +2 -2
  82. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  83. package/dist/lib/server/decisioning/index.js +4 -1
  84. package/dist/lib/server/decisioning/index.js.map +1 -1
  85. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
  86. package/dist/lib/server/decisioning/manifest-helpers.js +0 -2
  87. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
  88. package/dist/lib/server/decisioning/runtime/from-platform.js +65 -12
  89. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  90. package/dist/lib/server/decisioning/start-time.d.ts.map +1 -1
  91. package/dist/lib/server/decisioning/start-time.js +0 -2
  92. package/dist/lib/server/decisioning/start-time.js.map +1 -1
  93. package/dist/lib/server/decisioning/tenant-registry.d.ts +99 -3
  94. package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -1
  95. package/dist/lib/server/decisioning/tenant-registry.js +223 -0
  96. package/dist/lib/server/decisioning/tenant-registry.js.map +1 -1
  97. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  98. package/dist/lib/testing/compliance/comply.js +46 -11
  99. package/dist/lib/testing/compliance/comply.js.map +1 -1
  100. package/dist/lib/testing/compliance/storyboard-tracks.js +22 -5
  101. package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
  102. package/dist/lib/testing/compliance/types.d.ts +21 -1
  103. package/dist/lib/testing/compliance/types.d.ts.map +1 -1
  104. package/dist/lib/testing/storyboard/default-invariants.js +17 -0
  105. package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
  106. package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
  107. package/dist/lib/testing/storyboard/loader.js +41 -0
  108. package/dist/lib/testing/storyboard/loader.js.map +1 -1
  109. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  110. package/dist/lib/testing/storyboard/runner.js +107 -17
  111. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  112. package/dist/lib/testing/storyboard/types.d.ts +37 -0
  113. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  114. package/dist/lib/testing/storyboard/types.js.map +1 -1
  115. package/dist/lib/types/error-codes.d.ts +196 -9
  116. package/dist/lib/types/error-codes.d.ts.map +1 -1
  117. package/dist/lib/types/error-codes.js +104 -26
  118. package/dist/lib/types/error-codes.js.map +1 -1
  119. package/dist/lib/types/v2-5/index.d.ts +2 -0
  120. package/dist/lib/types/v2-5/index.d.ts.map +1 -0
  121. package/dist/lib/types/v2-5/index.js +30 -0
  122. package/dist/lib/types/v2-5/index.js.map +1 -0
  123. package/dist/lib/types/v2-5/tools.generated.d.ts +3507 -0
  124. package/dist/lib/types/v2-5/tools.generated.d.ts.map +1 -0
  125. package/dist/lib/types/v2-5/tools.generated.js +6 -0
  126. package/dist/lib/types/v2-5/tools.generated.js.map +1 -0
  127. package/dist/lib/utils/buyer-retry-policy.d.ts +136 -0
  128. package/dist/lib/utils/buyer-retry-policy.d.ts.map +1 -0
  129. package/dist/lib/utils/buyer-retry-policy.js +247 -0
  130. package/dist/lib/utils/buyer-retry-policy.js.map +1 -0
  131. package/dist/lib/utils/sync-creatives-adapter.d.ts +18 -8
  132. package/dist/lib/utils/sync-creatives-adapter.d.ts.map +1 -1
  133. package/dist/lib/utils/sync-creatives-adapter.js +70 -17
  134. package/dist/lib/utils/sync-creatives-adapter.js.map +1 -1
  135. package/dist/lib/validation/client-hooks.d.ts +13 -8
  136. package/dist/lib/validation/client-hooks.d.ts.map +1 -1
  137. package/dist/lib/validation/client-hooks.js +12 -12
  138. package/dist/lib/validation/client-hooks.js.map +1 -1
  139. package/dist/lib/version.d.ts +3 -3
  140. package/dist/lib/version.js +3 -3
  141. package/docs/guides/BUILD-AN-AGENT.md +2 -0
  142. package/docs/llms.txt +39 -22
  143. package/examples/decisioning-platform-multi-tenant.ts +26 -4
  144. package/package.json +11 -1
  145. package/skills/build-seller-agent/SKILL.md +38 -5
  146. package/skills/build-seller-agent/specialisms/sales-guaranteed.md +4 -3
  147. package/skills/call-adcp-agent.previous/SKILL.md +83 -4
@@ -233,14 +233,93 @@ Quick lookup before reading the full envelope. Match what you see in `adcp_error
233
233
  | `keyword: 'enum'` at `/destinations/*/type` | Made-up destination type | Use `'platform'` (with `platform`) or `'agent'` (with `agent_url`). |
234
234
  | Response carries `status: 'submitted'` and `task_id` | Async — work is queued, NOT done | Poll via `tasks/get` (A2A) or the MCP async task extension using `task_id`. |
235
235
  | `recovery: 'transient'` (rate limit, 5xx, timeout) | Server-side, retry-safe | Retry with the **same** `idempotency_key`. |
236
- <<<<<<< Updated upstream
237
236
  | `406 Not Acceptable` before any AdCP framing | Hand-rolled HTTP without `Accept: text/event-stream` (MCP transport) | Use `@modelcontextprotocol/sdk` client; it sets the right Accept header. |
238
- =======
239
- >>>>>>> Stashed changes
240
- | `recovery: 'correctable'` | Buyer-side fix | Read `issues[]`, patch the pointers, resend. Most cases close in one attempt. |
237
+ | `recovery: 'correctable'` | Buyer-side fix | Read `issues[]`, patch the pointers, resend. Most cases close in one attempt. (See exceptions below — four codes are technically `correctable` but operator-semantically human-escalate.) |
241
238
  | `recovery: 'terminal'` (account suspended, payment required, …) | Requires human action | Don't retry. Surface to the user. |
242
239
  | HTTP 401 with `WWW-Authenticate` header | Missing or expired credential | Add `Authorization` per the agent's auth spec; re-auth if applicable. |
243
240
 
241
+ > **⚠️ Four codes are technically `correctable` but operator-semantically human-escalate. Don't auto-tweak.**
242
+ >
243
+ > - **`POLICY_VIOLATION`** — buyer's content/targeting violates seller policy. Auto-mutating creative or targeting and resubmitting **looks like evasion** to the seller's governance reviewer. Surface to a human.
244
+ > - **`COMPLIANCE_UNSATISFIED`** — required disclosure can't be satisfied by the chosen format. Auto-relaxing the compliance section IS the compliance failure. Surface to a human.
245
+ > - **`GOVERNANCE_DENIED`** — registered governance agent rejected the spend. Auto-shrinking budget and retrying looks like governance evasion. Surface to the plan operator.
246
+ > - **`AUTH_REQUIRED`** — conflates missing creds (genuinely correctable) with revoked / expired creds (operator must rotate). Until [adcontextprotocol/adcp#3730](https://github.com/adcontextprotocol/adcp/issues/3730) splits this into `auth_missing` + `auth_invalid`, treat as escalate-after-one-attempt.
247
+ >
248
+ > Spec recovery on these is `correctable`; operator behavior is human-in-loop. The pattern: read `error.message` + `error.suggestion`, surface to the user, **don't loop**.
249
+
250
+ ### Operationalize the recovery rules — `decideRetry`
251
+
252
+ `@adcp/sdk` exports `decideRetry(error, ctx?)` which encodes the operator-grade defaults from the table above plus this section. It returns a discriminated `RetryDecision` so the type system enforces the same-vs-fresh `idempotency_key` rule:
253
+
254
+ ```typescript
255
+ import { decideRetry } from '@adcp/sdk';
256
+ import { randomUUID } from 'node:crypto';
257
+
258
+ async function callWithRetry(toolName: string, params: Record<string, unknown>): Promise<unknown> {
259
+ let attempt = 1;
260
+ let idempotencyKey = randomUUID();
261
+
262
+ while (true) {
263
+ try {
264
+ return await agent.call(toolName, { ...params, idempotency_key: idempotencyKey });
265
+ } catch (e) {
266
+ const error = extractAdcpError(e); // your SDK's error extractor
267
+ if (!error) throw e; // not an AdCP-shaped failure — let it bubble
268
+
269
+ const decision = decideRetry(error, { attempt });
270
+
271
+ if (decision.action === 'retry') {
272
+ // Server-side transient (RATE_LIMITED, SERVICE_UNAVAILABLE, CONFLICT).
273
+ // Replay with the SAME idempotency_key after the suggested delay.
274
+ await sleep(decision.delayMs);
275
+ attempt++;
276
+ continue;
277
+ }
278
+
279
+ if (decision.action === 'mutate-and-retry') {
280
+ // Buyer-fixable. Apply the seller's correction (decision.field /
281
+ // decision.suggestion) and mint a FRESH idempotency_key — payload
282
+ // changed, so the seller's replay-window must NOT dedupe.
283
+ params = applyCorrection(params, error, decision); // your domain logic
284
+ idempotencyKey = randomUUID();
285
+ await sleep(decision.delayMs); // small jitter (~125-250ms by default)
286
+ attempt++;
287
+ continue;
288
+ }
289
+
290
+ // 'escalate' — stop the loop and surface to a human. Includes
291
+ // commercial-relationship signals (POLICY_VIOLATION etc.), auth
292
+ // failures, IDEMPOTENCY_EXPIRED (do a natural-key check first!),
293
+ // attempt-cap exhaustion, and unknown vendor codes.
294
+ throw new EscalationRequired(decision.reason, decision.message);
295
+ }
296
+ }
297
+ }
298
+ ```
299
+
300
+ The discriminated union means TypeScript narrows correctly in each branch — `decision.delayMs` is only available on retry/mutate-and-retry, `decision.field` only on mutate-and-retry, `decision.message` only on escalate.
301
+
302
+ For per-vertical overrides (e.g., a creative-template platform that legitimately auto-fixes `CREATIVE_REJECTED` format mismatches), instantiate `BuyerRetryPolicy` directly:
303
+
304
+ ```typescript
305
+ import { BuyerRetryPolicy } from '@adcp/sdk';
306
+
307
+ const policy = new BuyerRetryPolicy({
308
+ overrides: {
309
+ CREATIVE_REJECTED: (error) => {
310
+ if (error.field === 'creative.format' && /unsupported_format/.test(error.message)) {
311
+ return { action: 'mutate-and-retry', delayMs: 0, attemptCap: 2, sameIdempotencyKey: false, reason: 'capability' };
312
+ }
313
+ return null; // fall through to default (escalate as commercial)
314
+ },
315
+ },
316
+ });
317
+
318
+ const decision = policy.decide(error, { attempt });
319
+ ```
320
+
321
+ Default policy is intentionally conservative — see the source comments in `src/lib/utils/buyer-retry-policy.ts` for per-code reasoning.
322
+
244
323
  If your symptom isn't here, fall through to the next section.
245
324
 
246
325
  ## If you get stuck