@adcp/sdk 17.0.0-beta.1 → 17.0.0-beta.3
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.
- package/dist/lib/adapters/keyed-account-store.js +1 -1
- package/dist/lib/adapters/keyed-account-store.mjs +1 -1
- package/dist/lib/adapters/version/3.0/brand-fields.d.mts +7 -1
- package/dist/lib/adapters/version/3.0/brand-fields.d.ts +7 -1
- package/dist/lib/adapters/version/3.0/brand-fields.js +139 -3
- package/dist/lib/adapters/version/3.0/brand-fields.mjs +136 -2
- package/dist/lib/adapters/version/3.0/index.js +6 -0
- package/dist/lib/adapters/version/3.0/index.mjs +7 -1
- package/dist/lib/adapters/version/index.d.mts +9 -0
- package/dist/lib/adapters/version/index.d.ts +9 -0
- package/dist/lib/adapters/version/index.js +20 -6
- package/dist/lib/adapters/version/index.mjs +15 -2
- package/dist/lib/adapters/version/types.d.mts +5 -0
- package/dist/lib/adapters/version/types.d.ts +5 -0
- package/dist/lib/canonical-references/index.js +2 -0
- package/dist/lib/canonical-references/index.mjs +2 -0
- package/dist/lib/client/account-changes.d.mts +3 -1
- package/dist/lib/client/account-changes.d.ts +3 -1
- package/dist/lib/client/account-changes.js +22 -2
- package/dist/lib/client/account-changes.mjs +22 -2
- package/dist/lib/conformance/oracle.js +3 -2
- package/dist/lib/conformance/oracle.mjs +3 -2
- package/dist/lib/core/AgentClient.d.mts +165 -1
- package/dist/lib/core/AgentClient.d.ts +165 -1
- package/dist/lib/core/AgentClient.js +446 -8
- package/dist/lib/core/AgentClient.mjs +446 -8
- package/dist/lib/core/ConversationTypes.d.mts +8 -0
- package/dist/lib/core/ConversationTypes.d.ts +8 -0
- package/dist/lib/core/ProtocolResponseParser.d.mts +1 -1
- package/dist/lib/core/ProtocolResponseParser.d.ts +1 -1
- package/dist/lib/core/ProtocolResponseParser.js +28 -18
- package/dist/lib/core/ProtocolResponseParser.mjs +11 -1
- package/dist/lib/core/SingleAgentClient.d.mts +115 -2
- package/dist/lib/core/SingleAgentClient.d.ts +115 -2
- package/dist/lib/core/SingleAgentClient.js +547 -67
- package/dist/lib/core/SingleAgentClient.mjs +534 -54
- package/dist/lib/core/TaskExecutor.d.mts +7 -0
- package/dist/lib/core/TaskExecutor.d.ts +7 -0
- package/dist/lib/core/TaskExecutor.js +18 -5
- package/dist/lib/core/TaskExecutor.mjs +18 -5
- package/dist/lib/core/task-status.d.mts +2 -0
- package/dist/lib/core/task-status.d.ts +2 -0
- package/dist/lib/core/task-status.js +11 -2
- package/dist/lib/core/task-status.mjs +9 -1
- package/dist/lib/identity-3.3/trust.d.mts +1 -4
- package/dist/lib/identity-3.3/trust.d.ts +1 -4
- package/dist/lib/identity-3.3/trust.js +43 -23
- package/dist/lib/identity-3.3/trust.mjs +43 -23
- package/dist/lib/identity-3.3/validation.js +5 -3
- package/dist/lib/identity-3.3/validation.mjs +6 -4
- package/dist/lib/index.d.mts +6 -52
- package/dist/lib/index.d.ts +6 -52
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.mjs +7 -0
- package/dist/lib/media-buy/compatibility.js +6 -1
- package/dist/lib/media-buy/compatibility.mjs +6 -1
- package/dist/lib/protocols/mcp-scope.d.mts +3 -0
- package/dist/lib/protocols/mcp-scope.d.ts +3 -0
- package/dist/lib/protocols/mcp-scope.js +8 -3
- package/dist/lib/protocols/mcp-scope.mjs +8 -3
- package/dist/lib/reporting/inspection.js +1 -0
- package/dist/lib/reporting/inspection.mjs +1 -0
- package/dist/lib/reporting/ledger/coverage.d.mts +5 -0
- package/dist/lib/reporting/ledger/coverage.d.ts +5 -0
- package/dist/lib/reporting/ledger/coverage.js +37 -3
- package/dist/lib/reporting/ledger/coverage.mjs +36 -3
- package/dist/lib/reporting/ledger/handler.js +7 -4
- package/dist/lib/reporting/ledger/handler.mjs +7 -4
- package/dist/lib/reporting/ledger/producer.js +215 -69
- package/dist/lib/reporting/ledger/producer.mjs +217 -70
- package/dist/lib/reporting/ledger/schedule.d.mts +2 -2
- package/dist/lib/reporting/ledger/schedule.d.ts +2 -2
- package/dist/lib/reporting/ledger/schedule.js +8 -5
- package/dist/lib/reporting/ledger/schedule.mjs +8 -5
- package/dist/lib/reporting/ledger/status-ingest.d.mts +1 -1
- package/dist/lib/reporting/ledger/status-ingest.d.ts +1 -1
- package/dist/lib/reporting/ledger/status-ingest.js +4 -3
- package/dist/lib/reporting/ledger/status-ingest.mjs +4 -3
- package/dist/lib/reporting/ledger/types.d.mts +36 -1
- package/dist/lib/reporting/ledger/types.d.ts +36 -1
- package/dist/lib/reporting/service/index.d.mts +14 -1
- package/dist/lib/reporting/service/index.d.ts +14 -1
- package/dist/lib/reporting/service/index.js +24 -12
- package/dist/lib/reporting/service/index.mjs +24 -12
- package/dist/lib/schemas/browser.d.mts +2 -0
- package/dist/lib/schemas/browser.d.ts +2 -0
- package/dist/lib/schemas/browser.js +3 -0
- package/dist/lib/schemas/browser.mjs +2 -0
- package/dist/lib/schemas/index.d.mts +5 -3
- package/dist/lib/schemas/index.d.ts +5 -3
- package/dist/lib/schemas/index.js +5 -0
- package/dist/lib/schemas/index.mjs +4 -0
- package/dist/lib/server/a2a-adapter.js +2 -1
- package/dist/lib/server/a2a-adapter.mjs +2 -1
- package/dist/lib/server/account-response-identity.d.mts +17 -0
- package/dist/lib/server/account-response-identity.d.ts +17 -0
- package/dist/lib/server/account-response-identity.js +52 -0
- package/dist/lib/server/account-response-identity.mjs +28 -0
- package/dist/lib/server/account-sync-contract.js +2 -2
- package/dist/lib/server/account-sync-contract.mjs +2 -2
- package/dist/lib/server/auth-signature.d.mts +2 -2
- package/dist/lib/server/auth-signature.d.ts +2 -2
- package/dist/lib/server/auth-signature.js +3 -0
- package/dist/lib/server/auth-signature.mjs +3 -0
- package/dist/lib/server/create-adcp-server.d.mts +2 -2
- package/dist/lib/server/create-adcp-server.d.ts +2 -2
- package/dist/lib/server/create-adcp-server.js +58 -23
- package/dist/lib/server/create-adcp-server.mjs +61 -15
- package/dist/lib/server/decisioning/account.d.mts +36 -10
- package/dist/lib/server/decisioning/account.d.ts +36 -10
- package/dist/lib/server/decisioning/account.js +33 -14
- package/dist/lib/server/decisioning/account.mjs +33 -14
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +5 -5
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +5 -5
- package/dist/lib/server/decisioning/runtime/from-platform.js +4 -4
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +4 -4
- package/dist/lib/server/media-buy-store.d.mts +26 -12
- package/dist/lib/server/media-buy-store.d.ts +26 -12
- package/dist/lib/server/media-buy-store.js +69 -21
- package/dist/lib/server/media-buy-store.mjs +69 -21
- package/dist/lib/server/notification-subscriptions/runtime.d.mts +1 -1
- package/dist/lib/server/notification-subscriptions/runtime.d.ts +1 -1
- package/dist/lib/server/notification-subscriptions/runtime.js +4 -0
- package/dist/lib/server/notification-subscriptions/runtime.mjs +4 -0
- package/dist/lib/server/responses.js +9 -1
- package/dist/lib/server/responses.mjs +9 -1
- package/dist/lib/server/serve.js +3 -1
- package/dist/lib/server/serve.mjs +3 -1
- package/dist/lib/server/signed-request-transport.d.mts +1 -0
- package/dist/lib/server/signed-request-transport.d.ts +1 -0
- package/dist/lib/server/signed-request-transport.js +46 -0
- package/dist/lib/server/signed-request-transport.mjs +20 -0
- package/dist/lib/server/test-controller.d.mts +1 -0
- package/dist/lib/server/test-controller.d.ts +1 -0
- package/dist/lib/server/test-controller.js +5 -1
- package/dist/lib/server/test-controller.mjs +5 -1
- package/dist/lib/signing/agent-fetch.d.mts +1 -1
- package/dist/lib/signing/agent-fetch.d.ts +1 -1
- package/dist/lib/signing/agent-fetch.js +3 -3
- package/dist/lib/signing/agent-fetch.mjs +3 -3
- package/dist/lib/testing/index.d.mts +1 -0
- package/dist/lib/testing/index.d.ts +1 -0
- package/dist/lib/testing/index.js +3 -0
- package/dist/lib/testing/index.mjs +2 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +61 -29
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +61 -29
- package/dist/lib/testing/storyboard/compliance.d.mts +2 -5
- package/dist/lib/testing/storyboard/compliance.d.ts +2 -5
- package/dist/lib/testing/storyboard/compliance.js +62 -13
- package/dist/lib/testing/storyboard/compliance.mjs +63 -14
- package/dist/lib/testing/storyboard/index.d.mts +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +1 -0
- package/dist/lib/testing/storyboard/index.js +3 -0
- package/dist/lib/testing/storyboard/index.mjs +2 -0
- package/dist/lib/testing/storyboard/loader.js +7 -0
- package/dist/lib/testing/storyboard/loader.mjs +7 -0
- package/dist/lib/testing/storyboard/request-builder.js +9 -6
- package/dist/lib/testing/storyboard/request-builder.mjs +9 -6
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.js +11 -0
- package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +10 -0
- package/dist/lib/testing/storyboard/runner.js +59 -6
- package/dist/lib/testing/storyboard/runner.mjs +59 -6
- package/dist/lib/testing/storyboard/types.d.mts +18 -0
- package/dist/lib/testing/storyboard/types.d.ts +18 -0
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/storyboard/web-bot-auth.d.mts +10 -0
- package/dist/lib/testing/storyboard/web-bot-auth.d.ts +10 -0
- package/dist/lib/testing/storyboard/web-bot-auth.js +80 -0
- package/dist/lib/testing/storyboard/web-bot-auth.mjs +56 -0
- package/dist/lib/types/accept-proposal.d.ts +20 -28
- package/dist/lib/types/asset-instances.d.mts +1 -1
- package/dist/lib/types/asset-instances.d.ts +1 -1
- package/dist/lib/types/buy-products.d.ts +20 -28
- package/dist/lib/types/check-governance.d.ts +20 -28
- package/dist/lib/types/comply-test-controller.d.ts +20 -28
- package/dist/lib/types/control-media-buy.d.ts +20 -28
- package/dist/lib/types/core.generated.d.mts +273 -184
- package/dist/lib/types/core.generated.d.ts +273 -184
- package/dist/lib/types/create-media-buy.d.ts +20 -28
- package/dist/lib/types/get-media-buys.d.ts +20 -28
- package/dist/lib/types/get-products.d.ts +20 -28
- package/dist/lib/types/index.d.mts +6 -1
- package/dist/lib/types/index.d.ts +6 -1
- package/dist/lib/types/index.js +6 -1
- package/dist/lib/types/index.mjs +4 -1
- package/dist/lib/types/inline-enums.generated.d.mts +30 -4
- package/dist/lib/types/inline-enums.generated.d.ts +30 -4
- package/dist/lib/types/inline-enums.generated.js +41 -2
- package/dist/lib/types/inline-enums.generated.mjs +28 -2
- package/dist/lib/types/list-products.d.ts +20 -28
- package/dist/lib/types/list-proposals.d.ts +20 -28
- package/dist/lib/types/media-buy-delivery-report.d.mts +6 -0
- package/dist/lib/types/media-buy-delivery-report.d.ts +6 -0
- package/dist/lib/types/media-buy-delivery-report.js +16 -0
- package/dist/lib/types/media-buy-delivery-report.mjs +0 -0
- package/dist/lib/types/refine-proposals.d.ts +20 -28
- package/dist/lib/types/request-proposals.d.ts +20 -28
- package/dist/lib/types/schemas.generated.d.ts +63113 -127273
- package/dist/lib/types/schemas.generated.js +759 -770
- package/dist/lib/types/schemas.generated.mjs +759 -770
- package/dist/lib/types/targeting-keys.generated.d.mts +4 -0
- package/dist/lib/types/targeting-keys.generated.d.ts +4 -0
- package/dist/lib/types/targeting-keys.generated.js +109 -0
- package/dist/lib/types/targeting-keys.generated.mjs +84 -0
- package/dist/lib/types/tools.generated.d.mts +2 -68
- package/dist/lib/types/tools.generated.d.ts +2 -68
- package/dist/lib/types/update-media-buy.d.ts +20 -28
- package/dist/lib/utils/adcp-version-config.js +5 -2
- package/dist/lib/utils/adcp-version-config.mjs +5 -2
- package/dist/lib/utils/response-unwrapper.js +6 -1
- package/dist/lib/utils/response-unwrapper.mjs +6 -1
- package/dist/lib/v2/format-schema/resolver.js +1 -1
- package/dist/lib/v2/format-schema/resolver.mjs +1 -1
- package/dist/lib/v2/projection/creative-delivery.js +104 -29
- package/dist/lib/v2/projection/creative-delivery.mjs +108 -29
- package/dist/lib/v2/projection/index.d.mts +1 -0
- package/dist/lib/v2/projection/index.d.ts +1 -0
- package/dist/lib/v2/projection/index.js +3 -0
- package/dist/lib/v2/projection/index.mjs +2 -0
- package/dist/lib/v2/projection/legacy-metadata.d.mts +19 -0
- package/dist/lib/v2/projection/legacy-metadata.d.ts +19 -0
- package/dist/lib/v2/projection/legacy-metadata.js +91 -0
- package/dist/lib/v2/projection/legacy-metadata.mjs +86 -0
- package/dist/lib/v2/projection/v1-to-v2.d.mts +1 -1
- package/dist/lib/v2/projection/v1-to-v2.d.ts +1 -1
- package/dist/lib/v2/projection/v1-to-v2.js +12 -9
- package/dist/lib/v2/projection/v1-to-v2.mjs +12 -9
- package/dist/lib/validation/budget-allocation.d.mts +3 -3
- package/dist/lib/validation/budget-allocation.d.ts +3 -3
- package/dist/lib/validation/compact-schema.d.mts +27 -0
- package/dist/lib/validation/compact-schema.d.ts +27 -0
- package/dist/lib/validation/compact-schema.js +276 -0
- package/dist/lib/validation/compact-schema.mjs +250 -0
- package/dist/lib/validation/media-buy-delivery-report.d.mts +8 -0
- package/dist/lib/validation/media-buy-delivery-report.d.ts +8 -0
- package/dist/lib/validation/media-buy-delivery-report.js +31 -0
- package/dist/lib/validation/media-buy-delivery-report.mjs +7 -0
- package/dist/lib/validation/nonempty-array.d.mts +15 -0
- package/dist/lib/validation/nonempty-array.d.ts +15 -0
- package/dist/lib/validation/nonempty-array.js +41 -0
- package/dist/lib/validation/nonempty-array.mjs +7 -0
- package/dist/lib/validation/schema-diagnostic-origins.d.mts +21 -0
- package/dist/lib/validation/schema-diagnostic-origins.d.ts +21 -0
- package/dist/lib/validation/schema-diagnostic-origins.js +193 -0
- package/dist/lib/validation/schema-diagnostic-origins.mjs +169 -0
- package/dist/lib/validation/schema-loader.js +86 -16
- package/dist/lib/validation/schema-loader.mjs +82 -16
- package/dist/lib/validation/schema-validator.d.mts +10 -19
- package/dist/lib/validation/schema-validator.d.ts +10 -19
- package/dist/lib/validation/schema-validator.js +135 -42
- package/dist/lib/validation/schema-validator.mjs +139 -43
- package/dist/lib/validation/sync-creatives.d.mts +22 -22
- package/dist/lib/validation/sync-creatives.d.ts +22 -22
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/webhooks/index.d.mts +3 -0
- package/dist/lib/webhooks/index.d.ts +3 -0
- package/dist/lib/webhooks/index.js +3 -0
- package/dist/lib/webhooks/index.mjs +2 -0
- package/dist/lib/webhooks/media-buy-delivery.d.mts +43 -0
- package/dist/lib/webhooks/media-buy-delivery.d.ts +43 -0
- package/dist/lib/webhooks/media-buy-delivery.js +119 -0
- package/dist/lib/webhooks/media-buy-delivery.mjs +94 -0
- package/docs/TYPE-SUMMARY.md +2 -2
- package/docs/guides/DELIVERY-WEBHOOK-PARSING.md +142 -0
- package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +15 -0
- package/docs/guides/REPORTING-LEDGER.md +93 -0
- package/docs/guides/REPORTING-STABILITY.md +1 -1
- package/docs/guides/TYPED-CLIENT-TOOLS.md +49 -0
- package/docs/llms.txt +2 -2
- package/docs/migration-14.x-rc-worksheet.md +4 -4
- package/docs/migration-16-to-17.md +218 -14
- package/docs/migration-6.6-to-6.7.md +14 -0
- package/docs/migration-account-change-feed.md +15 -0
- package/docs/migration-agent-identity-3.3.md +106 -4
- package/docs/recipes/verifying-inbound-webhooks.md +18 -2
- package/package.json +16 -3
|
@@ -5,23 +5,135 @@ development and staging; production remains on SDK 16 and AdCP 3.2.
|
|
|
5
5
|
|
|
6
6
|
## Companion packages
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
`^
|
|
11
|
-
makes npm report an invalid tree (`npm ls` prints
|
|
12
|
-
`invalid: "^16.0.0" from node_modules/@adcp/reporting-storage` for `0.1.x`) or
|
|
13
|
-
refuse with `ERESOLVE`. Install the
|
|
14
|
-
storage release from the same `beta` train:
|
|
8
|
+
The next release pairs **`@adcp/sdk@17.0.0-beta.2`** with
|
|
9
|
+
**`@adcp/reporting-storage@0.3.0-beta.1`**. The storage package requires SDK
|
|
10
|
+
`^17.0.0-beta.2`; install and lock both packages together after publication:
|
|
15
11
|
|
|
16
12
|
```bash
|
|
17
|
-
npm install --save-exact @adcp/sdk@17.0.0-beta.
|
|
13
|
+
npm install --save-exact @adcp/sdk@17.0.0-beta.2 @adcp/reporting-storage@0.3.0-beta.1
|
|
14
|
+
npm ls @adcp/sdk @adcp/reporting-storage
|
|
18
15
|
```
|
|
19
16
|
|
|
20
|
-
`
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
The `beta` tags select that release train once published. Stable storage
|
|
18
|
+
`0.2.0` accepts SDK `^16.5.0`, including SDK 16.6; it does not accept SDK 17.
|
|
19
|
+
The earlier SDK 17 beta.0/beta.1 pair used storage `0.2.1-beta.0`, whose code
|
|
20
|
+
and SQL migrations matched `0.2.0` and whose peer range was `^17.0.0-beta.0`.
|
|
21
|
+
A stable range such as `~0.2.0` does not select either storage prerelease.
|
|
22
|
+
|
|
23
|
+
Storage `0.3.0-beta.1` also includes reporting configuration history. Reapply
|
|
24
|
+
`REPORTING_LEDGER_MIGRATION` before starting the new workers: it adds the
|
|
25
|
+
nullable `adcp_reporting_configurations.history_start` audit column and
|
|
26
|
+
live-priority indexes idempotently. Upgrade all workers before granting or
|
|
27
|
+
extending historical ownership. Existing configurations retain their original
|
|
28
|
+
history boundary until the trusted host explicitly changes it. See the
|
|
29
|
+
[reporting ledger guide](./guides/REPORTING-LEDGER.md) for history, source
|
|
30
|
+
retention, pacing, and custom-store requirements.
|
|
31
|
+
|
|
32
|
+
If upgrading from SDK 16.4 or earlier, also read the
|
|
33
|
+
[storage 0.2.0 notes](https://github.com/adcontextprotocol/adcp-client/blob/main/packages/reporting-storage/CHANGELOG.md#020)
|
|
34
|
+
for BigQuery sinks that omit `location`.
|
|
35
|
+
|
|
36
|
+
## Added union and enum members
|
|
37
|
+
|
|
38
|
+
These additions are relative to the bundled AdCP 3.2.7 contract. Update exhaustive
|
|
39
|
+
switches and runtime accept-lists deliberately; the unversioned `*Values` arrays
|
|
40
|
+
always describe the SDK's current pin, not the negotiated seller release.
|
|
41
|
+
|
|
42
|
+
| Surface | Added members or requirement | Migration action |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| Account notification types | `collection_card.updated`, `collection_card.removed`, `collection_catalog.bulk_change`, `proposal.created` | Add handlers or explicitly exclude them from subscriptions. `ACCOUNT_NOTIFICATION_TYPES` includes all four. |
|
|
45
|
+
| `OutcomeTarget.goal.kind` | `vendor_metric` | Narrow all three goal kinds before accessing `metric`; see below. |
|
|
46
|
+
| `UniversalMacroValues` | `ADDTL_CONSENT` | Review macro accept-lists. Parameterized `GDPR_CONSENT_<gvl_id>` names also remain valid; the finite runtime array does not enumerate them. |
|
|
47
|
+
| Delivery `metric_id` / `AvailableMetric` | `print_metrics`, `publication` | Handle print-specific delivery aggregates. |
|
|
48
|
+
| `DemographicSystem` | `nmo`, `videoamp` | Review audience and demographic system filters. |
|
|
49
|
+
| Price adjustment `kind` | `operator_fee` | Include operator fees in supported price adjustment handling. |
|
|
50
|
+
| Seller-originated account changes | Nonempty `changed_paths` for `origin.kind: 'adcp'` or `'seller_operator'` | Populate paths on 3.3 pages. This is not required on 3.2 pages. |
|
|
51
|
+
| Creative asset content types / format slots | `video_brief` | Accept generation briefs separately from finished video assets. |
|
|
52
|
+
| Canonical format option kinds | `seller_rendered_stateful_display`, `coordinated_placements` | Update format-kind switches. |
|
|
53
|
+
| `PrincipalChangedWebhook.reason` | `relationship_changed`, `relationship_expiring` | Refresh relationship state when these invalidations arrive. |
|
|
54
|
+
| Product card asset `role` | `sample_content` | Update card-reference rendering switches. |
|
|
55
|
+
| Wholesale feed `entity_type` | `collection` | Handle collection invalidations; the feed event and webhook type unions include the three collection events above. |
|
|
56
|
+
| `ErrorCode` | `CREATIVE_MERGE_REJECTED`, `REFERENCE_DEFINITION_CHANGED`, `RIGHTS_CHANNEL_VIOLATION` | Handle the advertised recovery behavior; do not assume every new code is transient. |
|
|
57
|
+
| `IndicatorType` | `flight_extension_opportunity`, `scale_budget_opportunity` | Update indicator filters and displays. |
|
|
58
|
+
| `PixelTrackingEvent` | `start`, `first_quartile`, `midpoint`, `third_quartile`, `complete` | Review tracking event accept-lists. |
|
|
59
|
+
| `ProposalRefinementReason` / refinement action | `definition_changed` / `extend_hold` | Handle changed definitions and explicit hold extension. |
|
|
60
|
+
| `Specialism` | `sales-fixed-rate` | Include fixed-rate sellers in capability classification. |
|
|
61
|
+
| Canonical hosted-video codecs / containers | `mpeg2`, `avc_intra`, `xavc` / `mxf` | Update media validation and ingest routing. |
|
|
62
|
+
| Brand identity requested / available fields | `collections` | Handle collection identity fields if requested. |
|
|
63
|
+
| Creative listing fields | `provenance` | Include provenance only when requested and authorized. |
|
|
64
|
+
| Signal listing fields | `age_determination_bases`, `signal_status`, `source_audience_id` | Update field-selection lists. |
|
|
65
|
+
| Account change repair task / lifecycle tools | `list_proposals` | Refresh proposal state for relevant invalidations. |
|
|
66
|
+
| Event-source sync row action | `archived` | Handle archived source readback. |
|
|
67
|
+
| Entity hydration types | `creative_seller_revision`, `governance_budget_period` | Update entity type routing if used. |
|
|
68
|
+
| Agent permission denial reason | `grant_absent` | Handle missing grants in permission diagnostics. |
|
|
69
|
+
| Compliance controller operation | `mutate_definition` | Available to test-controller scenarios. |
|
|
70
|
+
|
|
71
|
+
`OutcomeTarget.goal` is now `metric | event | vendor_metric`. After excluding
|
|
72
|
+
`event`, a value can still be `vendor_metric`, which has `vendor` and `metric_id`
|
|
73
|
+
instead of `metric`. On proposal requests and refinements, sellers declaring
|
|
74
|
+
outcome-target planning but supporting only delivery metrics should reject
|
|
75
|
+
unsupported goals with `INVALID_REQUEST` naming `criteria.outcome_target.goal`.
|
|
76
|
+
A vendor goal requires the product's declared vendor/metric pair and a cumulative
|
|
77
|
+
total. Sellers that do not declare outcome-target planning reject the field
|
|
78
|
+
with `UNSUPPORTED_FEATURE`. On `list_products` the field is inert: perform schema
|
|
79
|
+
validation but do not reject it merely because the goal is unsupported.
|
|
80
|
+
|
|
81
|
+
## Public asset and targeting types
|
|
82
|
+
|
|
83
|
+
Import the shared `AssetVariant` union from `@adcp/sdk`, `@adcp/sdk/types`, or
|
|
84
|
+
`@adcp/sdk/schemas`. Per-tool type slices stay self-contained and expose the
|
|
85
|
+
same structural contract. `AssetVariantSchema` has an explicit `z.ZodType`
|
|
86
|
+
annotation to keep `z.output<typeof AssetVariantSchema>` shallow and assignable
|
|
87
|
+
to that union, including nonempty video-brief segments and macro declarations.
|
|
88
|
+
|
|
89
|
+
`DaypartTarget` is a union of complete whole-hour and minute-resolution forms.
|
|
90
|
+
Check `start_hour !== undefined` before using hour arithmetic; minute windows
|
|
91
|
+
use `start_time` and `end_time` and can cross midnight. Mixing the forms or
|
|
92
|
+
omitting either endpoint is a type error.
|
|
93
|
+
|
|
94
|
+
`TargetingOverlayKeys` and `TargetingOverlaySupportKeys` are frozen runtime key
|
|
95
|
+
arrays exported from `@adcp/sdk` and `@adcp/sdk/types`. They include
|
|
96
|
+
`collection_lists`, `collection_lists_exclude`, and extension fields. Use them
|
|
97
|
+
for exhaustive dimension handling instead of maintaining local copies.
|
|
98
|
+
|
|
99
|
+
`streamAccountChanges` validates each page using trusted negotiated/wire
|
|
100
|
+
metadata before any seller echo. Without authoritative release metadata, the
|
|
101
|
+
drain falls back to the seller echo and then the client's configured version. Custom
|
|
102
|
+
readers can pass `adcpVersion: '3.2.7'` in the drain options. This selects
|
|
103
|
+
validation only; the reader remains responsible for sending the matching
|
|
104
|
+
request release. Existing cursor, account identity, and acknowledgement checks
|
|
105
|
+
still apply.
|
|
106
|
+
|
|
107
|
+
A `3.3.0` or `3.3` configuration pin does not select a beta. Use the exact
|
|
108
|
+
`3.3.0-beta.0` bundle (wire alias `3.3-beta.0`); unavailable pins now produce a
|
|
109
|
+
short list of bundled release lines instead of every compatible patch.
|
|
110
|
+
|
|
111
|
+
## pnpm peer resolution
|
|
112
|
+
|
|
113
|
+
The official A2A SDK `1.0.1` already marks its Express peer optional, and the
|
|
114
|
+
AdCP SDK marks OpenTelemetry optional. AdCP cannot change a transitive package's
|
|
115
|
+
peer metadata by adding an Express entry to its own manifest. pnpm can still
|
|
116
|
+
create multiple SDK instances when workspace importers supply different peer
|
|
117
|
+
versions or different optional-peer sets. Install one compatible peer set at
|
|
118
|
+
the workspace root and align it across importers.
|
|
119
|
+
|
|
120
|
+
For workspaces that need explicit convergence, declare the three packages as
|
|
121
|
+
direct root dependencies, then use their declared specs in `pnpm-workspace.yaml`:
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
dedupePeerDependents: true
|
|
125
|
+
resolvePeersFromWorkspaceRoot: true
|
|
126
|
+
overrides:
|
|
127
|
+
'@a2a-js/sdk': '$@a2a-js/sdk'
|
|
128
|
+
'@modelcontextprotocol/sdk': '$@modelcontextprotocol/sdk'
|
|
129
|
+
'@opentelemetry/api': '$@opentelemetry/api'
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Choose versions satisfying all consumers before applying overrides; they do not
|
|
133
|
+
make incompatible peer contracts compatible. Run `pnpm install`, `pnpm dedupe`,
|
|
134
|
+
and `pnpm why -r @adcp/sdk` to inspect the resulting graph. See
|
|
135
|
+
[pnpm's dependency-resolution settings](https://github.com/pnpm/pnpm/blob/main/pnpm/docs/settings/dependency-resolution.md)
|
|
136
|
+
and [peer-dependency settings](https://pnpm.io/settings#dedupepeerdependents).
|
|
25
137
|
|
|
26
138
|
## Protocol and discovery
|
|
27
139
|
|
|
@@ -39,6 +151,25 @@ server handlers are `mediaBuy.listCollections` and `mediaBuy.listProposals`,
|
|
|
39
151
|
or optional methods on `MediaBuyLifecyclePlatform`. Their synchronous results
|
|
40
152
|
use `outcome` and do not acquire a synthetic task `status` field.
|
|
41
153
|
|
|
154
|
+
## Postgres replay store
|
|
155
|
+
|
|
156
|
+
`PostgresReplayStore` inserts through a table-specific guarded function
|
|
157
|
+
(`<table>_insert_guarded`) that keeps the replay check, the per-key cap and the
|
|
158
|
+
insert on one backend. A database created by an earlier SDK has the table but
|
|
159
|
+
not the function. Every insert then fails with "PostgresReplayStore database
|
|
160
|
+
migration is outdated", and signed requests answer 503 (Web Bot Auth) or are
|
|
161
|
+
refused. Rerun the migration for each replay table before deploying SDK 17:
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
import { getReplayStoreMigration } from '@adcp/sdk/signing/server';
|
|
165
|
+
|
|
166
|
+
await pool.query(getReplayStoreMigration('adcp_replay_cache')); // your table name
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
The migration is idempotent. If you manage schema with numbered migration
|
|
170
|
+
files, add a new file with the current `getReplayStoreMigration()` output; a
|
|
171
|
+
file copied from an older SDK does not create the function.
|
|
172
|
+
|
|
42
173
|
## Account resolution and optional declarations
|
|
43
174
|
|
|
44
175
|
On a served AdCP 3.3 route, buyer-supplied account references require a
|
|
@@ -118,7 +249,11 @@ conversion before dispatch; deliver creatives with declared macros through the
|
|
|
118
249
|
canonical `display_tag` contract. Legacy HTML also has no `markup_type` field;
|
|
119
250
|
when converted for a canonical request, its markup type defaults to `standard`. Existing legacy
|
|
120
251
|
request assets remain unchanged on the legacy wire. Explicit seller declarations
|
|
121
|
-
retain their format kind and delivery types.
|
|
252
|
+
retain their format kind and delivery types. In dual-emitted products, an old
|
|
253
|
+
`html5` option paired with a `display_*_html` ID does not erase valid pairings
|
|
254
|
+
for sibling image/video options. The incompatible HTML option is left unpaired;
|
|
255
|
+
fix that seller declaration to `display_tag` with inline-markup delivery before
|
|
256
|
+
using it. The SDK does not reinterpret a seller's declared zip contract.
|
|
122
257
|
|
|
123
258
|
These changes follow [adcp#8339](https://github.com/adcontextprotocol/adcp/issues/8339)
|
|
124
259
|
and [adcp#8357](https://github.com/adcontextprotocol/adcp/pull/8357). They use the
|
|
@@ -133,3 +268,72 @@ Account verification applies to the selected request release. Unversioned caller
|
|
|
133
268
|
The direct governance helpers and governance middleware retain their configured client protocol pin. For a stable governance agent, use a client configured with `adcpVersion: '3.2.7'`; `syncPlans` and `getPlanAuditLogs` also accept an explicit `wireAdcpVersion` in their task options. Per-agent negotiation for these direct governance paths remains follow-up work.
|
|
134
269
|
|
|
135
270
|
AdCP 3.3 definition pins require revalidation against the current third-party published definitions at commitment time. This beta's synchronous standalone commercial-terms verifier cannot perform that source verification: it fails closed on definition pins, publisher format references, and any placement/collection/signal targeting. Use the seller-served stable 3.2.7 contract for existing snapshot-verification flows until pin verification is supported. It continues to compare ordinary 3.3 commercial snapshots and enforces collection-list uniqueness by reference identity.
|
|
271
|
+
|
|
272
|
+
For AdCP 3.0 buyers, `create_media_buy` and `update_media_buy` responses move
|
|
273
|
+
`media_buy_status` back into lifecycle `status` before schema projection. A buy
|
|
274
|
+
waiting on creatives therefore returns `status: 'pending_creatives'`; 3.1+
|
|
275
|
+
responses keep task `status` separate from `media_buy_status`.
|
|
276
|
+
|
|
277
|
+
This projection applies to responses the framework emits. A webhook your
|
|
278
|
+
platform builds itself from a copy of the response, such as an inline completion
|
|
279
|
+
callback to a 3.0 buyer, does not pass through it. Apply the same mapping so the
|
|
280
|
+
webhook `result` matches the buyer-visible response: for a 3.0 buyer, carry the
|
|
281
|
+
media buy status as `status` and omit `media_buy_status`. A test comparing the
|
|
282
|
+
webhook `result` with the synchronous response catches drift. Exporting the
|
|
283
|
+
projection for seller-emitted webhooks is tracked in #3475.
|
|
284
|
+
|
|
285
|
+
## Receivers with their own delivery webhook verification
|
|
286
|
+
|
|
287
|
+
`parseMediaBuyDeliveryWebhook` from `@adcp/sdk/webhooks` validates an already
|
|
288
|
+
authenticated body at a trusted `adcpVersion`, with readable envelope/result
|
|
289
|
+
errors and an explicit, marked `acceptBareDeliveryReport` compatibility option.
|
|
290
|
+
The registered reporting-delivery branch of `verifyAndParseWebhook` delegates
|
|
291
|
+
to it and accepts a per-call `adcpVersion` for stored buy contracts.
|
|
292
|
+
|
|
293
|
+
Use `MediaBuyDeliveryReportSchema` and `MediaBuyDeliveryReport` for one polled
|
|
294
|
+
and pushed ingestion shape without fabricating task status. Full poll response
|
|
295
|
+
schemas keep the status required by their referenced protocol envelope;
|
|
296
|
+
`MediaBuyDeliveryWebhookResultSchema` now enforces required `by_package` rows.
|
|
297
|
+
See [Parsing media-buy delivery webhooks](./guides/DELIVERY-WEBHOOK-PARSING.md).
|
|
298
|
+
|
|
299
|
+
Registered reporting receivers now distinguish `webhook_result_invalid` from
|
|
300
|
+
`webhook_envelope_invalid`, and use `webhook_unsupported_payload` for another
|
|
301
|
+
task type or a bare report. Update exhaustive code switches accordingly.
|
|
302
|
+
Invalid reporting schema configuration returns `webhook_verification_unavailable`
|
|
303
|
+
before consuming a nonce. Routing metadata uses the trusted registration's
|
|
304
|
+
operation ID; the seller's original ID stays in the validated envelope.
|
|
305
|
+
|
|
306
|
+
Zod schemas now enforce protocol-authored `minItems` bounds throughout, including
|
|
307
|
+
nonempty creative segments and render-guidance positions. Correct previously
|
|
308
|
+
accepted empty arrays where the protocol requires at least one item; nonempty
|
|
309
|
+
array output types are now `[T, ...T[]]`.
|
|
310
|
+
|
|
311
|
+
## Account identity in sync results
|
|
312
|
+
|
|
313
|
+
`accounts.upsert` results now preserve `account`, `operator_unit`, `revision`,
|
|
314
|
+
`identity_change`, `identity_change_preview`, `currency`, and `timezone` (#3466).
|
|
315
|
+
`SyncAccountsResultRow` declares these fields. For 3.2+ settings updates, return
|
|
316
|
+
`account` as the identity anchor and omit flat `brand`/`operator`; provisioning
|
|
317
|
+
results use the natural key. Older releases still require the flat pair. Failed
|
|
318
|
+
3.2+ rows may omit `status` when the account state could not be determined.
|
|
319
|
+
|
|
320
|
+
The entire `destination_billing_entity` is request-only and is stripped from
|
|
321
|
+
responses, including its legal name and tax details. This differs from the
|
|
322
|
+
current `billing_entity`, whose non-bank metadata is returned while `bank` is
|
|
323
|
+
stripped. The rule applies both to framework `accounts.upsert` projection and
|
|
324
|
+
the raw account response builders before replay caching.
|
|
325
|
+
|
|
326
|
+
Consumers reading `SyncAccountsResultRow` should narrow the identity anchor and
|
|
327
|
+
check failed rows before assuming `brand`, `operator`, or `status` are present.
|
|
328
|
+
The type now rejects missing or mixed identity anchors and successful rows
|
|
329
|
+
without a lifecycle status.
|
|
330
|
+
|
|
331
|
+
Nested account and operator identity objects must conform to their closed
|
|
332
|
+
protocol schemas. Internal fields accidentally retained from a request or DB
|
|
333
|
+
record are rejected before response emission, even when whole-response
|
|
334
|
+
validation is off.
|
|
335
|
+
|
|
336
|
+
`SyncAccountsResultRow` is now a union type. Replace interface extension with
|
|
337
|
+
an intersection alias such as `type MyRow = SyncAccountsResultRow & { upstreamId?: string }`.
|
|
338
|
+
Identity objects are emitted as detached validated snapshots. Raw account
|
|
339
|
+
response builders also strip top-level `authInfo` and `ctx_metadata`.
|
|
@@ -1061,6 +1061,20 @@ paths produce a value. The store fills the gap for adopters who
|
|
|
1061
1061
|
hadn't wired echo yet (the canonical silent-storyboard-failure for
|
|
1062
1062
|
`media_buy_seller/inventory_list_targeting/get_after_create`).
|
|
1063
1063
|
|
|
1064
|
+
The current store also persists buy-level and package-level `context` from
|
|
1065
|
+
`create_media_buy`, including empty objects and null-valued keys. It fills
|
|
1066
|
+
missing resource context on `get_media_buys`; seller-provided echoes and the
|
|
1067
|
+
read request's top-level context take precedence. Targeting updates retain
|
|
1068
|
+
creation context. Context for packages added by `update_media_buy` remains
|
|
1069
|
+
adapter-owned.
|
|
1070
|
+
|
|
1071
|
+
Package context follows unambiguous echoed identities (`product_id`,
|
|
1072
|
+
`package_id`, or legacy `buyer_ref`). Positional matching requires equal
|
|
1073
|
+
package counts and no contradictory identities. If pairing is ambiguous,
|
|
1074
|
+
only context echoed on the create response is retained for that package.
|
|
1075
|
+
Existing targeting-only records need no migration; creation context cannot
|
|
1076
|
+
be recovered retroactively from those records.
|
|
1077
|
+
|
|
1064
1078
|
### 16. **breaking** — drop `customTools["update_rights"]`; wire `BrandRightsPlatform.updateRights`
|
|
1065
1079
|
|
|
1066
1080
|
`update_rights` is now a framework-registered first-class tool (PR
|
|
@@ -262,3 +262,18 @@ status-change record and webhook, so the subsequent authoritative
|
|
|
262
262
|
creative library needed by the scenario's applicability check. Those training
|
|
263
263
|
seller changes belong upstream; they do not introduce buyer durable storage or
|
|
264
264
|
a persistent subscription runtime into the SDK.
|
|
265
|
+
|
|
266
|
+
### Validating older feed releases
|
|
267
|
+
|
|
268
|
+
`streamAccountChanges` uses negotiated response metadata, the served-version echo,
|
|
269
|
+
or the client's configured AdCP version to select the page schema. For a custom
|
|
270
|
+
reader without SDK metadata, pass `adcpVersion: '3.2.7'` in the stream options and
|
|
271
|
+
send the same release in your reader's requests. AdCP 3.3 requires nonempty
|
|
272
|
+
`changed_paths` on seller-originated changes; AdCP 3.2 does not.
|
|
273
|
+
|
|
274
|
+
When available, `metadata.wireAdcpVersion` records the trusted SDK-selected wire
|
|
275
|
+
release, independently of the seller echo. Drains prefer negotiated/wire
|
|
276
|
+
metadata, then a custom reader's explicit `adcpVersion`, then the echo and
|
|
277
|
+
configured client pin. An older echo cannot weaken a known wire contract.
|
|
278
|
+
Sellers without authoritative release metadata keep the echo/client fallback;
|
|
279
|
+
use an explicit validation pin for a custom reader when its release is known.
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
The experimental identity rollout is tracked in
|
|
4
4
|
[adcp-client#3233](https://github.com/adcontextprotocol/adcp-client/issues/3233).
|
|
5
5
|
This release implements the rollout behind explicit experimental configuration.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
SDK 17 beta pins `ADCP_VERSION` to **3.3.0-beta.0**; SDK 16 remains on 3.2.
|
|
7
|
+
The identity experiment can change before graduation. Setting `identity33`
|
|
8
|
+
selects the 3.3 schema scope for the entire server instance, including its
|
|
9
|
+
non-identity tools. To keep an existing 3.2 endpoint while evaluating identity,
|
|
10
|
+
create a separate server instance and mount it on another route.
|
|
10
11
|
|
|
11
12
|
The dedicated API is `@adcp/sdk/identity-3.3`. Existing RFC configuration remains
|
|
12
13
|
supported through 3.x and emits a one-time deprecation warning when used.
|
|
@@ -287,6 +288,99 @@ reassignment. Authorization runs before idempotency lookup and handler effects.
|
|
|
287
288
|
Keep the normal buyer registry's suspension, blocking, sandbox and billing
|
|
288
289
|
gates enabled; grants do not replace them.
|
|
289
290
|
|
|
291
|
+
### Custom MCP hosts
|
|
292
|
+
|
|
293
|
+
`signedRequests` installs HTTP middleware through `ADCP_PRE_TRANSPORT`. `serve()`
|
|
294
|
+
and `createA2AAdapter()` consume it automatically. A host that calls
|
|
295
|
+
`server.connect(transport)` directly must mount that middleware before handing
|
|
296
|
+
requests to the MCP transport; the server refuses the connection when the hook has not been
|
|
297
|
+
consumed. Connecting the transport alone cannot verify HTTP signatures.
|
|
298
|
+
Reading the symbol acknowledges that the custom host mounts the middleware;
|
|
299
|
+
the framework cannot verify external middleware installation. Socket Mode and
|
|
300
|
+
in-memory transports cannot run this HTTP verifier; use a separate server
|
|
301
|
+
instance without `signedRequests` for those transports.
|
|
302
|
+
Framework-managed MCP connections are permitted per transport after middleware
|
|
303
|
+
accepts the request. Creating an A2A adapter does not acknowledge MCP middleware.
|
|
304
|
+
|
|
305
|
+
For a host with its own authentication layer, compose
|
|
306
|
+
`verifySignatureAsAuthenticator({ webBotAuth, ... })` instead. A Web Bot Auth-only
|
|
307
|
+
authenticator can omit `jwks`; legacy signatures are then refused. For example:
|
|
308
|
+
|
|
309
|
+
```ts
|
|
310
|
+
import { createIdentity33PrincipalResolver } from '@adcp/sdk/identity-3.3';
|
|
311
|
+
import {
|
|
312
|
+
adcpOperationResolver,
|
|
313
|
+
requireSignatureWhenPresent,
|
|
314
|
+
verifySignatureAsAuthenticator,
|
|
315
|
+
} from '@adcp/sdk/server';
|
|
316
|
+
|
|
317
|
+
const signature = verifySignatureAsAuthenticator({
|
|
318
|
+
capability: {
|
|
319
|
+
supported: true,
|
|
320
|
+
profiles: ['web-bot-auth'],
|
|
321
|
+
covers_content_digest: 'required',
|
|
322
|
+
required_for: [],
|
|
323
|
+
},
|
|
324
|
+
replayStore, // Shared across requests and replicas.
|
|
325
|
+
resolveOperation: adcpOperationResolver,
|
|
326
|
+
// Trusted deployment config; never use caller-supplied forwarding headers.
|
|
327
|
+
getUrl: () => 'https://seller.example.com/mcp',
|
|
328
|
+
webBotAuth: {
|
|
329
|
+
directory,
|
|
330
|
+
resolvePrincipal: createIdentity33PrincipalResolver({ lifecycle, revocation: revocations }),
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
const authenticate = requireSignatureWhenPresent(signature, existingAuthenticator);
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Bind this authenticator to the configured `/mcp` route. The host must capture
|
|
337
|
+
the exact UTF-8 body in `req.rawBody` before JSON parsing,
|
|
338
|
+
run `authenticate` before `transport.handleRequest`, and propagate the returned
|
|
339
|
+
principal and authentication failures through its existing auth integration.
|
|
340
|
+
Hoist the authenticator and replay store outside request factories. If using
|
|
341
|
+
`serve()` with this authenticator, it captures the body automatically.
|
|
342
|
+
|
|
343
|
+
### Signed storyboard steps against a local agent
|
|
344
|
+
|
|
345
|
+
Storyboard steps can select a named runtime identity:
|
|
346
|
+
|
|
347
|
+
```yaml
|
|
348
|
+
auth: { type: web_bot_auth, identity: authorized_buyer }
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Pass keys separately from the YAML:
|
|
352
|
+
|
|
353
|
+
```ts
|
|
354
|
+
import { runStoryboard } from '@adcp/sdk/testing';
|
|
355
|
+
|
|
356
|
+
await runStoryboard('http://127.0.0.1:3001/mcp', storyboard, {
|
|
357
|
+
protocol: 'mcp',
|
|
358
|
+
allow_http: true,
|
|
359
|
+
web_bot_auth: {
|
|
360
|
+
publicUrl: 'https://seller.example.com/mcp',
|
|
361
|
+
identities: {
|
|
362
|
+
authorized_buyer: { origin: 'https://buyer.agency.com', key: { privateKey: buyerJwk } },
|
|
363
|
+
impersonator: { origin: 'https://other.agency.com', key: { privateKey: otherJwk } },
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Loopback delivery supports MCP; A2A steps can sign directly to HTTPS. The
|
|
370
|
+
official MCP client signs the public HTTPS target and delivers to the exact
|
|
371
|
+
loopback endpoint. Configure the local verifier's trusted public URL to match,
|
|
372
|
+
and publish or inject the identities' directory, revocation and trust records.
|
|
373
|
+
Each overridden step uses a separate client and strips ambient bearer/API-key
|
|
374
|
+
credentials. An unknown identity fails the step before dispatch. These steps
|
|
375
|
+
support tool-response validations; HTTP probe assertions and session probes
|
|
376
|
+
require their existing authentication directives. The URL override accepts only
|
|
377
|
+
loopback delivery, keeps redirects disabled, and does not relax the production
|
|
378
|
+
signer's HTTPS requirement. Omit `publicUrl` for signing directly to HTTPS.
|
|
379
|
+
For custom official transport wiring, `createStoryboardWebBotAuthFetch` from
|
|
380
|
+
`@adcp/sdk/testing` exposes the same delivery helper.
|
|
381
|
+
For direct HTTPS use of the helper, pass `agentUrl` to pin the destination
|
|
382
|
+
origin. Redirects are refused before the transport can follow them.
|
|
383
|
+
|
|
290
384
|
`bindPrincipal` requires seller audit evidence. Existing RFC mappings require
|
|
291
385
|
explicit migration approval and an unambiguous origin. `sync_principal` may
|
|
292
386
|
create only a new principal under declared open tiers; legacy-ledger lookup is
|
|
@@ -310,6 +404,14 @@ provided notification ID as the emitter's delivery ID. Call
|
|
|
310
404
|
|
|
311
405
|
## Trust, grants, and revocation
|
|
312
406
|
|
|
407
|
+
Identity authorization requires registrable domains from the pinned PSL.
|
|
408
|
+
Special-use names such as `brand.example`, `localhost`, and IP addresses cannot
|
|
409
|
+
establish trust or grants; invalid brand, account-operator, and resolved-house
|
|
410
|
+
domains receive coded `PERMISSION_DENIED` refusals. For tests, use registrable
|
|
411
|
+
fixture domains and inject `TrustEvaluator({ fetchOptions: { trustedFetchFn } })`
|
|
412
|
+
to serve their test trust records without relying on live DNS. This hook changes
|
|
413
|
+
record delivery, not domain validation or grant authorization.
|
|
414
|
+
|
|
313
415
|
The operator is derived using the pinned ICANN+PRIVATE PSL, never a document
|
|
314
416
|
field or authoritative hop host. Trust reads allow one document hop, zero HTTP
|
|
315
417
|
redirects, 2 MiB, depth 32, and no duplicate JSON keys. Exactly one canonical
|
|
@@ -63,8 +63,10 @@ Inner delivery result only:
|
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
That inner object is valid delivery report content, but it is not valid as the
|
|
66
|
-
top-level webhook POST body. Receivers
|
|
67
|
-
it is missing the async transport fields.
|
|
66
|
+
top-level webhook POST body. Receivers reject it by default because
|
|
67
|
+
it is missing the async transport fields. Receivers migrating older senders may
|
|
68
|
+
explicitly opt into the marked bare-report compatibility path in
|
|
69
|
+
[Parsing media-buy delivery webhooks](../guides/DELIVERY-WEBHOOK-PARSING.md).
|
|
68
70
|
|
|
69
71
|
Status fields have different scopes: top-level `status` is the async task or
|
|
70
72
|
webhook event status; nested `media_buy_deliveries[].status` is the media buy's
|
|
@@ -72,6 +74,20 @@ delivery status. `idempotency_key` is unique per webhook event and stable across
|
|
|
72
74
|
retries of that event. Signatures cover the exact raw JSON bytes being sent, so
|
|
73
75
|
verify before parsing or re-serializing.
|
|
74
76
|
|
|
77
|
+
## Parse a delivery after your own signature checks
|
|
78
|
+
|
|
79
|
+
Multi-seller receivers with their own callback registry can call
|
|
80
|
+
`parseMediaBuyDeliveryWebhook(rawBody, { adcpVersion: savedBuy.adcpVersion })` from
|
|
81
|
+
`@adcp/sdk/webhooks` after verifying the original body bytes. It validates the
|
|
82
|
+
selected release's envelope and report, returns readable error paths, and does
|
|
83
|
+
not authenticate the sender itself. See the
|
|
84
|
+
[delivery parser guide](../guides/DELIVERY-WEBHOOK-PARSING.md) for the 3.0–3.3
|
|
85
|
+
contracts, shared poll/push body schema, and explicit bare-report migration.
|
|
86
|
+
|
|
87
|
+
Envelope status follows the release's task-status enum. A valid delayed report
|
|
88
|
+
may arrive with `status: 'working'`; `notification_type` does not select the
|
|
89
|
+
envelope status, and `completed` does not mean the media buy is finished.
|
|
90
|
+
|
|
75
91
|
## Recommended RFC 9421 Setup
|
|
76
92
|
|
|
77
93
|
Create one verifier per expected sending agent. The resolver is bound to that
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adcp/sdk",
|
|
3
|
-
"version": "17.0.0-beta.
|
|
3
|
+
"version": "17.0.0-beta.3",
|
|
4
4
|
"description": "AdCP SDK — client, server, and compliance harnesses for the AdContext Protocol (MCP + A2A)",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
".",
|
|
@@ -51,6 +51,16 @@
|
|
|
51
51
|
"default": "./dist/lib/compliance/index.js"
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
|
+
"./adapters/version": {
|
|
55
|
+
"import": {
|
|
56
|
+
"types": "./dist/lib/adapters/version/index.d.mts",
|
|
57
|
+
"default": "./dist/lib/adapters/version/index.mjs"
|
|
58
|
+
},
|
|
59
|
+
"require": {
|
|
60
|
+
"types": "./dist/lib/adapters/version/index.d.ts",
|
|
61
|
+
"default": "./dist/lib/adapters/version/index.js"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
54
64
|
"./advanced": {
|
|
55
65
|
"import": {
|
|
56
66
|
"types": "./dist/lib/advanced.d.mts",
|
|
@@ -432,6 +442,9 @@
|
|
|
432
442
|
"compliance": [
|
|
433
443
|
"dist/lib/compliance/index.d.ts"
|
|
434
444
|
],
|
|
445
|
+
"adapters/version": [
|
|
446
|
+
"dist/lib/adapters/version/index.d.ts"
|
|
447
|
+
],
|
|
435
448
|
"advanced": [
|
|
436
449
|
"dist/lib/advanced.d.ts"
|
|
437
450
|
],
|
|
@@ -646,7 +659,7 @@
|
|
|
646
659
|
"sync-registry-schemas": "tsx scripts/generate-registry-types.ts --sync",
|
|
647
660
|
"schemas:ensure": "tsx scripts/schemas-ensure.ts",
|
|
648
661
|
"schema-diff": "tsx scripts/schema-diff.ts",
|
|
649
|
-
"generate-types": "tsx scripts/generate-types.ts && tsx scripts/generate-enum-arrays.ts && tsx scripts/generate-inline-enum-arrays.ts && tsx scripts/generate-manifest-derived.ts && tsx scripts/generate-entity-hydration.ts && tsx scripts/generate-media-buy-update-fields.ts && tsx scripts/generate-media-buy-action-metadata.ts",
|
|
662
|
+
"generate-types": "tsx scripts/generate-types.ts && tsx scripts/generate-enum-arrays.ts && tsx scripts/generate-targeting-keys.ts && tsx scripts/generate-inline-enum-arrays.ts && tsx scripts/generate-manifest-derived.ts && tsx scripts/generate-entity-hydration.ts && tsx scripts/generate-media-buy-update-fields.ts && tsx scripts/generate-media-buy-action-metadata.ts",
|
|
650
663
|
"generate-manifest-derived": "tsx scripts/generate-manifest-derived.ts",
|
|
651
664
|
"generate-entity-hydration": "tsx scripts/generate-entity-hydration.ts",
|
|
652
665
|
"generate-types:all": "npm run generate-types",
|
|
@@ -732,7 +745,7 @@
|
|
|
732
745
|
"dependencies": {
|
|
733
746
|
"@modelcontextprotocol/client": "2.3.1",
|
|
734
747
|
"@modelcontextprotocol/ext-apps": "2.0.0",
|
|
735
|
-
"@modelcontextprotocol/node": "2.
|
|
748
|
+
"@modelcontextprotocol/node": "2.1.1",
|
|
736
749
|
"@modelcontextprotocol/server": "2.3.1",
|
|
737
750
|
"@types/ws": "^8.18.1",
|
|
738
751
|
"ajv": "^8.20.0",
|