@adcp/sdk 16.0.0-beta.1 → 16.0.0-beta.2
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/core/SingleAgentClient.d.mts +10 -1
- package/dist/lib/core/SingleAgentClient.d.ts +10 -1
- package/dist/lib/core/SingleAgentClient.js +29 -8
- package/dist/lib/core/SingleAgentClient.mjs +29 -8
- package/dist/lib/identity-3.3/generated-compat.d.mts +34 -0
- package/dist/lib/identity-3.3/generated-compat.d.ts +34 -0
- package/dist/lib/identity-3.3/generated-compat.js +16 -0
- package/dist/lib/identity-3.3/generated-compat.mjs +0 -0
- package/dist/lib/identity-3.3/index.d.mts +2 -2
- package/dist/lib/identity-3.3/index.d.ts +2 -2
- package/dist/lib/identity-3.3/index.js +4 -0
- package/dist/lib/identity-3.3/index.mjs +5 -1
- package/dist/lib/identity-3.3/lifecycle.d.mts +17 -5
- package/dist/lib/identity-3.3/lifecycle.d.ts +17 -5
- package/dist/lib/identity-3.3/lifecycle.js +32 -5
- package/dist/lib/identity-3.3/lifecycle.mjs +38 -6
- package/dist/lib/identity-3.3/revocation.d.mts +39 -3
- package/dist/lib/identity-3.3/revocation.d.ts +39 -3
- package/dist/lib/identity-3.3/revocation.js +88 -18
- package/dist/lib/identity-3.3/revocation.mjs +89 -19
- package/dist/lib/identity-3.3/server.d.mts +12 -0
- package/dist/lib/identity-3.3/server.d.ts +12 -0
- package/dist/lib/identity-3.3/server.js +103 -43
- package/dist/lib/identity-3.3/server.mjs +111 -45
- package/dist/lib/identity-3.3/trust.d.mts +62 -1
- package/dist/lib/identity-3.3/trust.d.ts +62 -1
- package/dist/lib/identity-3.3/trust.js +126 -21
- package/dist/lib/identity-3.3/trust.mjs +124 -21
- package/dist/lib/identity-3.3/types.d.mts +39 -11
- package/dist/lib/identity-3.3/types.d.ts +39 -11
- package/dist/lib/index.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.mjs +2 -0
- package/dist/lib/protocols/index.d.mts +1 -1
- package/dist/lib/protocols/index.d.ts +1 -1
- package/dist/lib/protocols/index.js +2 -2
- package/dist/lib/protocols/index.mjs +2 -2
- package/dist/lib/reporting/bigquery/index.js +8 -0
- package/dist/lib/reporting/bigquery/index.mjs +8 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/auth-signature.d.mts +6 -1
- package/dist/lib/server/auth-signature.d.ts +6 -1
- package/dist/lib/server/auth-signature.js +24 -13
- package/dist/lib/server/auth-signature.mjs +29 -13
- package/dist/lib/server/auth.d.mts +2 -2
- package/dist/lib/server/auth.d.ts +2 -2
- package/dist/lib/server/create-adcp-server.js +31 -10
- package/dist/lib/server/create-adcp-server.mjs +37 -11
- package/dist/lib/signing/crypto.js +8 -0
- package/dist/lib/signing/crypto.mjs +9 -1
- package/dist/lib/signing/fetch-async.js +1 -1
- package/dist/lib/signing/fetch-async.mjs +1 -1
- package/dist/lib/signing/fetch.js +1 -1
- package/dist/lib/signing/fetch.mjs +1 -1
- package/dist/lib/signing/middleware.js +9 -0
- package/dist/lib/signing/middleware.mjs +14 -0
- package/dist/lib/signing/parser.d.mts +8 -5
- package/dist/lib/signing/parser.d.ts +8 -5
- package/dist/lib/signing/parser.js +77 -61
- package/dist/lib/signing/parser.mjs +77 -61
- package/dist/lib/signing/revocation.js +3 -0
- package/dist/lib/signing/revocation.mjs +3 -0
- package/dist/lib/signing/verifier.js +1 -1
- package/dist/lib/signing/verifier.mjs +1 -1
- package/dist/lib/signing/web-bot-auth.d.mts +84 -10
- package/dist/lib/signing/web-bot-auth.d.ts +84 -10
- package/dist/lib/signing/web-bot-auth.js +259 -82
- package/dist/lib/signing/web-bot-auth.mjs +259 -87
- package/dist/lib/signing/webhook-verifier.js +1 -1
- package/dist/lib/signing/webhook-verifier.mjs +1 -1
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/v2/projection/catalog-snapshot.js +3 -1
- package/dist/lib/v2/projection/catalog-snapshot.mjs +3 -1
- package/dist/lib/v2/projection/creative-delivery.d.mts +31 -9
- package/dist/lib/v2/projection/creative-delivery.d.ts +31 -9
- package/dist/lib/v2/projection/index.d.mts +1 -1
- package/dist/lib/v2/projection/index.d.ts +1 -1
- package/dist/lib/v2/projection/index.js +2 -0
- package/dist/lib/v2/projection/index.mjs +2 -0
- package/dist/lib/v2/projection/legacy-routes.d.mts +10 -0
- package/dist/lib/v2/projection/legacy-routes.d.ts +10 -0
- package/dist/lib/v2/projection/legacy-routes.js +7 -0
- package/dist/lib/v2/projection/legacy-routes.mjs +6 -0
- 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/docs/TYPE-SUMMARY.md +2 -2
- package/docs/guides/REPORTING-LEDGER.md +15 -5
- package/docs/guides/REPORTING-OPERATIONS.md +17 -11
- package/docs/llms.txt +2 -2
- package/docs/migration-12-to-13.md +8 -0
- package/docs/migration-14.x-rc-worksheet.md +4 -4
- package/docs/migration-agent-identity-3.3.md +150 -11
- package/package.json +3 -1
|
@@ -25,6 +25,7 @@ __export(catalog_snapshot_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(catalog_snapshot_exports);
|
|
26
26
|
var import_resolve_agent_properties = require('../../discovery/resolve-agent-properties.js');
|
|
27
27
|
var import_canonical_properties = require('./canonical-properties.js');
|
|
28
|
+
var import_legacy_routes = require('./legacy-routes.js');
|
|
28
29
|
const compiledSnapshotCache = /* @__PURE__ */ new WeakMap();
|
|
29
30
|
function normalizedAgentUrl(value) {
|
|
30
31
|
return (0, import_resolve_agent_properties.canonicalizeAgentUrl)(value) ?? value;
|
|
@@ -202,7 +203,7 @@ function legacyFormatConverterFromCatalogSnapshots(snapshots, fallback) {
|
|
|
202
203
|
function canonicalFormatLegacyResolverFromCatalogSnapshots(snapshots, fallback) {
|
|
203
204
|
if (!snapshots || snapshots.length === 0) return fallback;
|
|
204
205
|
const compiled = compileProjectionCatalogSnapshots(snapshots);
|
|
205
|
-
|
|
206
|
+
const resolver = (context) => {
|
|
206
207
|
const refs = resolutionContextFormatOptionRefs(context);
|
|
207
208
|
if (refs.length === 0) return fallback?.(context);
|
|
208
209
|
const resolved = [];
|
|
@@ -225,6 +226,7 @@ function canonicalFormatLegacyResolverFromCatalogSnapshots(snapshots, fallback)
|
|
|
225
226
|
}
|
|
226
227
|
return [...new Map(resolved.map((ref) => [legacyRefKey(ref), ref])).values()];
|
|
227
228
|
};
|
|
229
|
+
return (0, import_legacy_routes.carryFormatOptionOrigins)(resolver, fallback);
|
|
228
230
|
}
|
|
229
231
|
function assertBidirectionalProjectionCatalogs(snapshots) {
|
|
230
232
|
const routeByCanonicalOption = /* @__PURE__ */ new Map();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { canonicalizeAgentUrl } from "../../discovery/resolve-agent-properties.mjs";
|
|
2
2
|
import { isCanonicalV1Translatable } from "./canonical-properties.mjs";
|
|
3
|
+
import { carryFormatOptionOrigins } from "./legacy-routes.mjs";
|
|
3
4
|
const compiledSnapshotCache = /* @__PURE__ */ new WeakMap();
|
|
4
5
|
function normalizedAgentUrl(value) {
|
|
5
6
|
return canonicalizeAgentUrl(value) ?? value;
|
|
@@ -177,7 +178,7 @@ function legacyFormatConverterFromCatalogSnapshots(snapshots, fallback) {
|
|
|
177
178
|
function canonicalFormatLegacyResolverFromCatalogSnapshots(snapshots, fallback) {
|
|
178
179
|
if (!snapshots || snapshots.length === 0) return fallback;
|
|
179
180
|
const compiled = compileProjectionCatalogSnapshots(snapshots);
|
|
180
|
-
|
|
181
|
+
const resolver = (context) => {
|
|
181
182
|
const refs = resolutionContextFormatOptionRefs(context);
|
|
182
183
|
if (refs.length === 0) return fallback?.(context);
|
|
183
184
|
const resolved = [];
|
|
@@ -200,6 +201,7 @@ function canonicalFormatLegacyResolverFromCatalogSnapshots(snapshots, fallback)
|
|
|
200
201
|
}
|
|
201
202
|
return [...new Map(resolved.map((ref) => [legacyRefKey(ref), ref])).values()];
|
|
202
203
|
};
|
|
204
|
+
return carryFormatOptionOrigins(resolver, fallback);
|
|
203
205
|
}
|
|
204
206
|
function assertBidirectionalProjectionCatalogs(snapshots) {
|
|
205
207
|
const routeByCanonicalOption = /* @__PURE__ */ new Map();
|
|
@@ -78,16 +78,38 @@ export type CanonicalCreateMediaBuyRequest = Omit<CanonicalCreativeResponse<Crea
|
|
|
78
78
|
packages?: CanonicalPackageRequest[];
|
|
79
79
|
};
|
|
80
80
|
type CanonicalReportingWebhook = NonNullable<CanonicalCreateMediaBuyRequest['reporting_webhook']>;
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Client-facing form of a wire reporting webhook `W`. Every field is optional:
|
|
83
|
+
* the SDK can supply the callback `url`, `reporting_frequency` and the
|
|
84
|
+
* `authentication` block from client configuration.
|
|
85
|
+
*
|
|
86
|
+
* `authentication` is optional even with a caller-supplied `url`. AdCP 3.3
|
|
87
|
+
* makes it optional on the wire when the seller signs webhooks under its
|
|
88
|
+
* profile (`webhook_signing.supported`), and the experimental 3.3 client sends
|
|
89
|
+
* the registration without it once it has negotiated that. Below 3.3 the wire
|
|
90
|
+
* still requires it: with `webhookUrlTemplate` configured the client throws
|
|
91
|
+
* rather than send a caller URL without credentials (it never pairs its own
|
|
92
|
+
* `webhookSecret` with a caller-controlled host), and request validation
|
|
93
|
+
* reports the missing field otherwise.
|
|
94
|
+
*
|
|
95
|
+
* Derived from `W` rather than restating its fields, so it accepts every
|
|
96
|
+
* reporting webhook the pinned schemas generate, whether they declare
|
|
97
|
+
* `authentication` required (3.2) or optional (3.3).
|
|
98
|
+
*
|
|
99
|
+
* Exported for the type tests only; not re-exported from the package root.
|
|
100
|
+
*/
|
|
101
|
+
export type ClientReportingWebhookInputFor<W extends {
|
|
102
|
+
url: string;
|
|
103
|
+
reporting_frequency: unknown;
|
|
104
|
+
}> = Omit<W, 'url' | 'authentication' | 'reporting_frequency'> & {
|
|
105
|
+
url?: W['url'];
|
|
106
|
+
reporting_frequency?: W['reporting_frequency'];
|
|
107
|
+
/** Atomic: `schemes` and `credentials` always come from the same source. */
|
|
108
|
+
authentication?: W extends {
|
|
109
|
+
authentication?: infer A;
|
|
110
|
+
} ? (unknown extends A ? never : A) : never;
|
|
83
111
|
};
|
|
84
|
-
type ClientReportingWebhookInput =
|
|
85
|
-
url?: never;
|
|
86
|
-
authentication?: CanonicalReportingWebhook['authentication'];
|
|
87
|
-
}) | (ReportingWebhookPreferences & {
|
|
88
|
-
url: CanonicalReportingWebhook['url'];
|
|
89
|
-
authentication: CanonicalReportingWebhook['authentication'];
|
|
90
|
-
});
|
|
112
|
+
type ClientReportingWebhookInput = ClientReportingWebhookInputFor<CanonicalReportingWebhook>;
|
|
91
113
|
/**
|
|
92
114
|
* Client-facing create request. The SDK may supply the reporting callback URL
|
|
93
115
|
* and its complete authentication block from client configuration; the wire
|
|
@@ -78,16 +78,38 @@ export type CanonicalCreateMediaBuyRequest = Omit<CanonicalCreativeResponse<Crea
|
|
|
78
78
|
packages?: CanonicalPackageRequest[];
|
|
79
79
|
};
|
|
80
80
|
type CanonicalReportingWebhook = NonNullable<CanonicalCreateMediaBuyRequest['reporting_webhook']>;
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Client-facing form of a wire reporting webhook `W`. Every field is optional:
|
|
83
|
+
* the SDK can supply the callback `url`, `reporting_frequency` and the
|
|
84
|
+
* `authentication` block from client configuration.
|
|
85
|
+
*
|
|
86
|
+
* `authentication` is optional even with a caller-supplied `url`. AdCP 3.3
|
|
87
|
+
* makes it optional on the wire when the seller signs webhooks under its
|
|
88
|
+
* profile (`webhook_signing.supported`), and the experimental 3.3 client sends
|
|
89
|
+
* the registration without it once it has negotiated that. Below 3.3 the wire
|
|
90
|
+
* still requires it: with `webhookUrlTemplate` configured the client throws
|
|
91
|
+
* rather than send a caller URL without credentials (it never pairs its own
|
|
92
|
+
* `webhookSecret` with a caller-controlled host), and request validation
|
|
93
|
+
* reports the missing field otherwise.
|
|
94
|
+
*
|
|
95
|
+
* Derived from `W` rather than restating its fields, so it accepts every
|
|
96
|
+
* reporting webhook the pinned schemas generate, whether they declare
|
|
97
|
+
* `authentication` required (3.2) or optional (3.3).
|
|
98
|
+
*
|
|
99
|
+
* Exported for the type tests only; not re-exported from the package root.
|
|
100
|
+
*/
|
|
101
|
+
export type ClientReportingWebhookInputFor<W extends {
|
|
102
|
+
url: string;
|
|
103
|
+
reporting_frequency: unknown;
|
|
104
|
+
}> = Omit<W, 'url' | 'authentication' | 'reporting_frequency'> & {
|
|
105
|
+
url?: W['url'];
|
|
106
|
+
reporting_frequency?: W['reporting_frequency'];
|
|
107
|
+
/** Atomic: `schemes` and `credentials` always come from the same source. */
|
|
108
|
+
authentication?: W extends {
|
|
109
|
+
authentication?: infer A;
|
|
110
|
+
} ? (unknown extends A ? never : A) : never;
|
|
83
111
|
};
|
|
84
|
-
type ClientReportingWebhookInput =
|
|
85
|
-
url?: never;
|
|
86
|
-
authentication?: CanonicalReportingWebhook['authentication'];
|
|
87
|
-
}) | (ReportingWebhookPreferences & {
|
|
88
|
-
url: CanonicalReportingWebhook['url'];
|
|
89
|
-
authentication: CanonicalReportingWebhook['authentication'];
|
|
90
|
-
});
|
|
112
|
+
type ClientReportingWebhookInput = ClientReportingWebhookInputFor<CanonicalReportingWebhook>;
|
|
91
113
|
/**
|
|
92
114
|
* Client-facing create request. The SDK may supply the reporting callback URL
|
|
93
115
|
* and its complete authentication block from client configuration; the wire
|
|
@@ -43,7 +43,7 @@ export { projectV1ProductToV2, canonicalDeclarationFromBareId, resolveCanonicalF
|
|
|
43
43
|
export type { V1ToV2Result, V1ToV2ProjectionOptions, BareFormatIdResolveOptions, LegacyFormatConversionContext, LegacyFormatConverter, LegacyFormatResolutionContext, LegacyFormatResolver, } from './v1-to-v2.mjs';
|
|
44
44
|
export { projectV2ProductToV1 } from './v2-to-v1.mjs';
|
|
45
45
|
export type { V2ToV1Result, V2ToV1ProjectionOptions, CanonicalFormatLegacyResolver, CanonicalFormatLegacyResolutionContext, CanonicalProductFormatLegacyResolutionContext, CanonicalCreativeFormatLegacyResolutionContext, CanonicalSelectorFormatLegacyResolutionContext, } from './v2-to-v1.mjs';
|
|
46
|
-
export { canonicalFormatLegacyResolverFromRoutes, legacyRoutesForProduct, type CanonicalFormatLegacyRoute, type LegacyRoutesForProductOptions, } from './legacy-routes.mjs';
|
|
46
|
+
export { canonicalFormatLegacyResolverFromRoutes, carryFormatOptionOrigins, legacyRoutesForProduct, type CanonicalFormatLegacyRoute, type LegacyRoutesForProductOptions, } from './legacy-routes.mjs';
|
|
47
47
|
export { augmentProductWithFormatOptions, withFormatOptions, toCanonicalFormatOptionsWithRoutes, toAdditiveCanonicalProduct, withAdditiveCanonicalFormatOptions, toCanonicalOnlyProduct, toCanonicalOnlyResponse, type V2AugmentedProduct, type AdditiveCanonicalProduct, type CanonicalOnlyProduct, } from './augment-response.mjs';
|
|
48
48
|
export { CanonicalFormat, audioDaastFormatDeclaration, audioHostedFormatDeclaration, audioVastFormatDeclaration, agentPlacementFormatDeclaration, canonicalFormatDeclaration, customFormatDeclaration, displayTagFormatDeclaration, legacyFormatRef, legacyFormatRefs, html5FormatDeclaration, imageCarouselFormatDeclaration, imageFormatDeclaration, nativeInFeedFormatDeclaration, productCard, productCardDetailed, responsiveCreativeFormatDeclaration, sellerRenderedStatefulDisplayFormatDeclaration, sponsoredPlacementFormatDeclaration, coordinatedPlacementsFormatDeclaration, videoHostedFormatDeclaration, videoVastFormatDeclaration, type CanonicalFormatDeclaration, type CanonicalFormatDeclarationFields, type CanonicalFormatKind, type CanonicalFormatParams, type FormatReferenceInput, type ProductCardDetailedFields, type ProductCardFields, } from './builders.mjs';
|
|
49
49
|
export { packageRefsForFormatOptions, packageRefsForCapabilities, legacyFormatIdsFromOptions, tryLegacyFormatIdsFromOptions, legacyFormatIdsForFormatOption, legacyFormatIdsForCapability, lintPackageFormatSelectorDimensions, FormatOptionRefsLookupError, CapabilityIdsLookupError, type PackageFormatRefs, type PackageCapabilityRefs, type FormatOptionRef, type FormatOptionSelector, type FormatOptionRefsLookupErrorCode, type CapabilityIdsLookupErrorCode, type PackageFormatSelectorInput, type PackageFormatSelectorDimensionOptions, type FixedSizeDimensions, type PackageFormatSelectorDimensionDiagnosticCode, type PackageFormatSelectorDimensionDiagnostic, } from './write-side.mjs';
|
|
@@ -43,7 +43,7 @@ export { projectV1ProductToV2, canonicalDeclarationFromBareId, resolveCanonicalF
|
|
|
43
43
|
export type { V1ToV2Result, V1ToV2ProjectionOptions, BareFormatIdResolveOptions, LegacyFormatConversionContext, LegacyFormatConverter, LegacyFormatResolutionContext, LegacyFormatResolver, } from './v1-to-v2';
|
|
44
44
|
export { projectV2ProductToV1 } from './v2-to-v1';
|
|
45
45
|
export type { V2ToV1Result, V2ToV1ProjectionOptions, CanonicalFormatLegacyResolver, CanonicalFormatLegacyResolutionContext, CanonicalProductFormatLegacyResolutionContext, CanonicalCreativeFormatLegacyResolutionContext, CanonicalSelectorFormatLegacyResolutionContext, } from './v2-to-v1';
|
|
46
|
-
export { canonicalFormatLegacyResolverFromRoutes, legacyRoutesForProduct, type CanonicalFormatLegacyRoute, type LegacyRoutesForProductOptions, } from './legacy-routes';
|
|
46
|
+
export { canonicalFormatLegacyResolverFromRoutes, carryFormatOptionOrigins, legacyRoutesForProduct, type CanonicalFormatLegacyRoute, type LegacyRoutesForProductOptions, } from './legacy-routes';
|
|
47
47
|
export { augmentProductWithFormatOptions, withFormatOptions, toCanonicalFormatOptionsWithRoutes, toAdditiveCanonicalProduct, withAdditiveCanonicalFormatOptions, toCanonicalOnlyProduct, toCanonicalOnlyResponse, type V2AugmentedProduct, type AdditiveCanonicalProduct, type CanonicalOnlyProduct, } from './augment-response';
|
|
48
48
|
export { CanonicalFormat, audioDaastFormatDeclaration, audioHostedFormatDeclaration, audioVastFormatDeclaration, agentPlacementFormatDeclaration, canonicalFormatDeclaration, customFormatDeclaration, displayTagFormatDeclaration, legacyFormatRef, legacyFormatRefs, html5FormatDeclaration, imageCarouselFormatDeclaration, imageFormatDeclaration, nativeInFeedFormatDeclaration, productCard, productCardDetailed, responsiveCreativeFormatDeclaration, sellerRenderedStatefulDisplayFormatDeclaration, sponsoredPlacementFormatDeclaration, coordinatedPlacementsFormatDeclaration, videoHostedFormatDeclaration, videoVastFormatDeclaration, type CanonicalFormatDeclaration, type CanonicalFormatDeclarationFields, type CanonicalFormatKind, type CanonicalFormatParams, type FormatReferenceInput, type ProductCardDetailedFields, type ProductCardFields, } from './builders';
|
|
49
49
|
export { packageRefsForFormatOptions, packageRefsForCapabilities, legacyFormatIdsFromOptions, tryLegacyFormatIdsFromOptions, legacyFormatIdsForFormatOption, legacyFormatIdsForCapability, lintPackageFormatSelectorDimensions, FormatOptionRefsLookupError, CapabilityIdsLookupError, type PackageFormatRefs, type PackageCapabilityRefs, type FormatOptionRef, type FormatOptionSelector, type FormatOptionRefsLookupErrorCode, type CapabilityIdsLookupErrorCode, type PackageFormatSelectorInput, type PackageFormatSelectorDimensionOptions, type FixedSizeDimensions, type PackageFormatSelectorDimensionDiagnosticCode, type PackageFormatSelectorDimensionDiagnostic, } from './write-side';
|
|
@@ -33,6 +33,7 @@ __export(projection_exports, {
|
|
|
33
33
|
canonicalFormatDeclaration: () => import_builders.canonicalFormatDeclaration,
|
|
34
34
|
canonicalFormatLegacyResolverFromCatalogSnapshots: () => import_catalog_snapshot.canonicalFormatLegacyResolverFromCatalogSnapshots,
|
|
35
35
|
canonicalFormatLegacyResolverFromRoutes: () => import_legacy_routes.canonicalFormatLegacyResolverFromRoutes,
|
|
36
|
+
carryFormatOptionOrigins: () => import_legacy_routes.carryFormatOptionOrigins,
|
|
36
37
|
coordinatedPlacementsFormatDeclaration: () => import_builders.coordinatedPlacementsFormatDeclaration,
|
|
37
38
|
customFormatDeclaration: () => import_builders.customFormatDeclaration,
|
|
38
39
|
displayTagFormatDeclaration: () => import_builders.displayTagFormatDeclaration,
|
|
@@ -111,6 +112,7 @@ var import_creative_delivery = require('./creative-delivery.js');
|
|
|
111
112
|
canonicalFormatDeclaration,
|
|
112
113
|
canonicalFormatLegacyResolverFromCatalogSnapshots,
|
|
113
114
|
canonicalFormatLegacyResolverFromRoutes,
|
|
115
|
+
carryFormatOptionOrigins,
|
|
114
116
|
coordinatedPlacementsFormatDeclaration,
|
|
115
117
|
customFormatDeclaration,
|
|
116
118
|
displayTagFormatDeclaration,
|
|
@@ -2,6 +2,7 @@ import { projectV1ProductToV2, canonicalDeclarationFromBareId, resolveCanonicalF
|
|
|
2
2
|
import { projectV2ProductToV1 } from "./v2-to-v1.mjs";
|
|
3
3
|
import {
|
|
4
4
|
canonicalFormatLegacyResolverFromRoutes,
|
|
5
|
+
carryFormatOptionOrigins,
|
|
5
6
|
legacyRoutesForProduct
|
|
6
7
|
} from "./legacy-routes.mjs";
|
|
7
8
|
import {
|
|
@@ -88,6 +89,7 @@ export {
|
|
|
88
89
|
canonicalFormatDeclaration,
|
|
89
90
|
canonicalFormatLegacyResolverFromCatalogSnapshots,
|
|
90
91
|
canonicalFormatLegacyResolverFromRoutes,
|
|
92
|
+
carryFormatOptionOrigins,
|
|
91
93
|
coordinatedPlacementsFormatDeclaration,
|
|
92
94
|
customFormatDeclaration,
|
|
93
95
|
displayTagFormatDeclaration,
|
|
@@ -81,4 +81,14 @@ export declare function legacyRoutesForProduct(productId: string, declarations:
|
|
|
81
81
|
* must agree that the seller did not declare it.
|
|
82
82
|
*/
|
|
83
83
|
export declare function formatOptionOriginFromRoutes(resolver: CanonicalFormatLegacyResolver | undefined, ref: FormatOptionReference, productId: string | undefined): FormatOptionOrigin | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Make `resolver` report the format-option origins recorded by `sources`.
|
|
86
|
+
*
|
|
87
|
+
* A resolver built by {@link canonicalFormatLegacyResolverFromRoutes} carries
|
|
88
|
+
* each route's `seller_declared` origin, which `AgentClient` reads to rewrite
|
|
89
|
+
* options the seller never declared on the canonical wire. A resolver that
|
|
90
|
+
* wraps or composes it is a new function and would otherwise carry none.
|
|
91
|
+
* Returns `resolver` itself, so the call can wrap a composition inline.
|
|
92
|
+
*/
|
|
93
|
+
export declare function carryFormatOptionOrigins(resolver: CanonicalFormatLegacyResolver, ...sources: ReadonlyArray<CanonicalFormatLegacyResolver | undefined>): CanonicalFormatLegacyResolver;
|
|
84
94
|
export declare function canonicalFormatLegacyResolverFromRoutes(routes: readonly CanonicalFormatLegacyRoute[]): CanonicalFormatLegacyResolver;
|
|
@@ -81,4 +81,14 @@ export declare function legacyRoutesForProduct(productId: string, declarations:
|
|
|
81
81
|
* must agree that the seller did not declare it.
|
|
82
82
|
*/
|
|
83
83
|
export declare function formatOptionOriginFromRoutes(resolver: CanonicalFormatLegacyResolver | undefined, ref: FormatOptionReference, productId: string | undefined): FormatOptionOrigin | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Make `resolver` report the format-option origins recorded by `sources`.
|
|
86
|
+
*
|
|
87
|
+
* A resolver built by {@link canonicalFormatLegacyResolverFromRoutes} carries
|
|
88
|
+
* each route's `seller_declared` origin, which `AgentClient` reads to rewrite
|
|
89
|
+
* options the seller never declared on the canonical wire. A resolver that
|
|
90
|
+
* wraps or composes it is a new function and would otherwise carry none.
|
|
91
|
+
* Returns `resolver` itself, so the call can wrap a composition inline.
|
|
92
|
+
*/
|
|
93
|
+
export declare function carryFormatOptionOrigins(resolver: CanonicalFormatLegacyResolver, ...sources: ReadonlyArray<CanonicalFormatLegacyResolver | undefined>): CanonicalFormatLegacyResolver;
|
|
84
94
|
export declare function canonicalFormatLegacyResolverFromRoutes(routes: readonly CanonicalFormatLegacyRoute[]): CanonicalFormatLegacyResolver;
|
|
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
var legacy_routes_exports = {};
|
|
20
20
|
__export(legacy_routes_exports, {
|
|
21
21
|
canonicalFormatLegacyResolverFromRoutes: () => canonicalFormatLegacyResolverFromRoutes,
|
|
22
|
+
carryFormatOptionOrigins: () => carryFormatOptionOrigins,
|
|
22
23
|
formatOptionOriginFromRoutes: () => formatOptionOriginFromRoutes,
|
|
23
24
|
legacyRoutesForProduct: () => legacyRoutesForProduct,
|
|
24
25
|
sameFormatOptionRef: () => sameFormatOptionRef,
|
|
@@ -204,6 +205,11 @@ function formatOptionOriginFromRoutes(resolver, ref, productId) {
|
|
|
204
205
|
if (matching.some((entry) => entry.origin === void 0)) return void 0;
|
|
205
206
|
return matching[0].origin;
|
|
206
207
|
}
|
|
208
|
+
function carryFormatOptionOrigins(resolver, ...sources) {
|
|
209
|
+
const carried = [resolver, ...sources].flatMap((source) => source ? originsByResolver.get(source) ?? [] : []);
|
|
210
|
+
if (carried.length > 0) originsByResolver.set(resolver, Object.freeze(carried));
|
|
211
|
+
return resolver;
|
|
212
|
+
}
|
|
207
213
|
function canonicalFormatLegacyResolverFromRoutes(routes) {
|
|
208
214
|
const index = /* @__PURE__ */ new Map();
|
|
209
215
|
const origins = [];
|
|
@@ -237,6 +243,7 @@ function canonicalFormatLegacyResolverFromRoutes(routes) {
|
|
|
237
243
|
// Annotate the CommonJS export names for ESM import in node:
|
|
238
244
|
0 && (module.exports = {
|
|
239
245
|
canonicalFormatLegacyResolverFromRoutes,
|
|
246
|
+
carryFormatOptionOrigins,
|
|
240
247
|
formatOptionOriginFromRoutes,
|
|
241
248
|
legacyRoutesForProduct,
|
|
242
249
|
sameFormatOptionRef,
|
|
@@ -176,6 +176,11 @@ function formatOptionOriginFromRoutes(resolver, ref, productId) {
|
|
|
176
176
|
if (matching.some((entry) => entry.origin === void 0)) return void 0;
|
|
177
177
|
return matching[0].origin;
|
|
178
178
|
}
|
|
179
|
+
function carryFormatOptionOrigins(resolver, ...sources) {
|
|
180
|
+
const carried = [resolver, ...sources].flatMap((source) => source ? originsByResolver.get(source) ?? [] : []);
|
|
181
|
+
if (carried.length > 0) originsByResolver.set(resolver, Object.freeze(carried));
|
|
182
|
+
return resolver;
|
|
183
|
+
}
|
|
179
184
|
function canonicalFormatLegacyResolverFromRoutes(routes) {
|
|
180
185
|
const index = /* @__PURE__ */ new Map();
|
|
181
186
|
const origins = [];
|
|
@@ -208,6 +213,7 @@ function canonicalFormatLegacyResolverFromRoutes(routes) {
|
|
|
208
213
|
}
|
|
209
214
|
export {
|
|
210
215
|
canonicalFormatLegacyResolverFromRoutes,
|
|
216
|
+
carryFormatOptionOrigins,
|
|
211
217
|
formatOptionOriginFromRoutes,
|
|
212
218
|
legacyRoutesForProduct,
|
|
213
219
|
sameFormatOptionRef,
|
package/dist/lib/version.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AdCP SDK library version
|
|
3
3
|
*/
|
|
4
|
-
export declare const LIBRARY_VERSION = "16.0.0-beta.
|
|
4
|
+
export declare const LIBRARY_VERSION = "16.0.0-beta.2";
|
|
5
5
|
/**
|
|
6
6
|
* AdCP specification version this library is built for
|
|
7
7
|
*/
|
|
@@ -33,10 +33,10 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];
|
|
|
33
33
|
* Full version information
|
|
34
34
|
*/
|
|
35
35
|
export declare const VERSION_INFO: {
|
|
36
|
-
readonly library: "16.0.0-beta.
|
|
36
|
+
readonly library: "16.0.0-beta.2";
|
|
37
37
|
readonly adcp: "3.2.4";
|
|
38
38
|
readonly compatibleVersions: readonly ["v2.5", "v2.6", "v3", "3.0.0", "3.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "3.0.5", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.0.19", "3.0.20", "3.0.21", "3.0.22", "3.0.23", "3.0.24", "3.0.25", "3.1.0", "3.1", "3.1.1", "3.1.2", "3.1.3", "3.1.4", "3.1.5", "3.1.6", "3.1.7", "3.1.8", "3.1.9", "3.1.10", "3.1.11", "3.1.12", "3.1.13", "3.1.14", "3.1.15", "3.1.16", "3.1.17", "3.1.18", "3.1.19", "3.1.20", "3.1.21", "3.1.22", "3.1.23", "3.1.24", "3.2.1", "3.2", "3.2.2", "3.2.3", "3.2.4"];
|
|
39
|
-
readonly generatedAt: "2026-10-
|
|
39
|
+
readonly generatedAt: "2026-10-15T15:37:12.181Z";
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Get the AdCP specification version this library is built for
|
package/dist/lib/version.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AdCP SDK library version
|
|
3
3
|
*/
|
|
4
|
-
export declare const LIBRARY_VERSION = "16.0.0-beta.
|
|
4
|
+
export declare const LIBRARY_VERSION = "16.0.0-beta.2";
|
|
5
5
|
/**
|
|
6
6
|
* AdCP specification version this library is built for
|
|
7
7
|
*/
|
|
@@ -33,10 +33,10 @@ export type AdcpVersion = (typeof COMPATIBLE_ADCP_VERSIONS)[number];
|
|
|
33
33
|
* Full version information
|
|
34
34
|
*/
|
|
35
35
|
export declare const VERSION_INFO: {
|
|
36
|
-
readonly library: "16.0.0-beta.
|
|
36
|
+
readonly library: "16.0.0-beta.2";
|
|
37
37
|
readonly adcp: "3.2.4";
|
|
38
38
|
readonly compatibleVersions: readonly ["v2.5", "v2.6", "v3", "3.0.0", "3.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "3.0.5", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.0.19", "3.0.20", "3.0.21", "3.0.22", "3.0.23", "3.0.24", "3.0.25", "3.1.0", "3.1", "3.1.1", "3.1.2", "3.1.3", "3.1.4", "3.1.5", "3.1.6", "3.1.7", "3.1.8", "3.1.9", "3.1.10", "3.1.11", "3.1.12", "3.1.13", "3.1.14", "3.1.15", "3.1.16", "3.1.17", "3.1.18", "3.1.19", "3.1.20", "3.1.21", "3.1.22", "3.1.23", "3.1.24", "3.2.1", "3.2", "3.2.2", "3.2.3", "3.2.4"];
|
|
39
|
-
readonly generatedAt: "2026-10-
|
|
39
|
+
readonly generatedAt: "2026-10-15T15:37:12.181Z";
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Get the AdCP specification version this library is built for
|
package/dist/lib/version.js
CHANGED
|
@@ -31,7 +31,7 @@ __export(version_exports, {
|
|
|
31
31
|
toReleasePrecisionVersion: () => toReleasePrecisionVersion
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(version_exports);
|
|
34
|
-
const LIBRARY_VERSION = "16.0.0-beta.
|
|
34
|
+
const LIBRARY_VERSION = "16.0.0-beta.2";
|
|
35
35
|
const ADCP_VERSION = "3.2.4";
|
|
36
36
|
const ADCP_MAJOR_VERSION = 3;
|
|
37
37
|
const COMPATIBLE_ADCP_VERSIONS = [
|
|
@@ -98,10 +98,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
|
|
|
98
98
|
"3.2.4"
|
|
99
99
|
];
|
|
100
100
|
const VERSION_INFO = {
|
|
101
|
-
library: "16.0.0-beta.
|
|
101
|
+
library: "16.0.0-beta.2",
|
|
102
102
|
adcp: "3.2.4",
|
|
103
103
|
compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
|
|
104
|
-
generatedAt: "2026-10-
|
|
104
|
+
generatedAt: "2026-10-15T15:37:12.181Z"
|
|
105
105
|
};
|
|
106
106
|
function getAdcpVersion() {
|
|
107
107
|
return ADCP_VERSION;
|
package/dist/lib/version.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const LIBRARY_VERSION = "16.0.0-beta.
|
|
1
|
+
const LIBRARY_VERSION = "16.0.0-beta.2";
|
|
2
2
|
const ADCP_VERSION = "3.2.4";
|
|
3
3
|
const ADCP_MAJOR_VERSION = 3;
|
|
4
4
|
const COMPATIBLE_ADCP_VERSIONS = [
|
|
@@ -65,10 +65,10 @@ const COMPATIBLE_ADCP_VERSIONS = [
|
|
|
65
65
|
"3.2.4"
|
|
66
66
|
];
|
|
67
67
|
const VERSION_INFO = {
|
|
68
|
-
library: "16.0.0-beta.
|
|
68
|
+
library: "16.0.0-beta.2",
|
|
69
69
|
adcp: "3.2.4",
|
|
70
70
|
compatibleVersions: COMPATIBLE_ADCP_VERSIONS,
|
|
71
|
-
generatedAt: "2026-10-
|
|
71
|
+
generatedAt: "2026-10-15T15:37:12.181Z"
|
|
72
72
|
};
|
|
73
73
|
function getAdcpVersion() {
|
|
74
74
|
return ADCP_VERSION;
|
package/docs/TYPE-SUMMARY.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AdCP Type Summary
|
|
2
2
|
|
|
3
|
-
> Generated at: 2026-10-
|
|
4
|
-
> @adcp/sdk v16.0.0-beta.
|
|
3
|
+
> Generated at: 2026-10-15
|
|
4
|
+
> @adcp/sdk v16.0.0-beta.2
|
|
5
5
|
|
|
6
6
|
Curated reference of the types that matter for using the AdCP client. For full generated types see `src/lib/types/tools.generated.ts` and `src/lib/types/core.generated.ts`.
|
|
7
7
|
|
|
@@ -1017,9 +1017,9 @@ setInterval(() => {
|
|
|
1017
1017
|
BigQuery's server-side `jobTimeoutMs` is not used: for a local-file load the
|
|
1018
1018
|
official client builds `configuration.load` from the load options and cannot
|
|
1019
1019
|
set job-level fields, and BigQuery silently drops `labels` and `jobTimeoutMs`
|
|
1020
|
-
found inside `configuration.load`. (Staging the file in GCS and submitting
|
|
1021
|
-
`bigquery.createJob` can set both; the sink does not stage
|
|
1022
|
-
same reason the `labels` option has no effect (it warns once per process and
|
|
1020
|
+
found inside `configuration.load`. (Staging the file in GCS and submitting
|
|
1021
|
+
the load with `bigquery.createJob` can set both; the sink does not stage
|
|
1022
|
+
files.) For the same reason the `labels` option has no effect (it warns once per process and
|
|
1023
1023
|
is deprecated). To attribute load cost, query
|
|
1024
1024
|
`` `region-<location>`.INFORMATION_SCHEMA.JOBS_BY_PROJECT `` (needs
|
|
1025
1025
|
`bigquery.jobs.listAll`; about 180 days of history), filtering on
|
|
@@ -1067,6 +1067,16 @@ setInterval(() => {
|
|
|
1067
1067
|
rejects after clearing the sink (it could not unregister the consumer), call
|
|
1068
1068
|
it again before restarting workers. Re-run `REPORTING_WAREHOUSE_SINK_MIGRATION`
|
|
1069
1069
|
after upgrading: it adds the `reset_generation` column.
|
|
1070
|
+
- Upgrading from 15.9.0: stop every 15.9.0 sink worker before starting newer
|
|
1071
|
+
ones, then re-apply `REPORTING_WAREHOUSE_SINK_MIGRATION`. A 15.9.0 worker
|
|
1072
|
+
cancels a load at its deadline, so one running beside a newer worker on the
|
|
1073
|
+
same sink can cancel a job the newer worker is waiting on. The job then ends
|
|
1074
|
+
`DONE` with an error and the attempt advances. Rows do not duplicate, but
|
|
1075
|
+
convergence slows. Also set `location` to the dataset's location: without it
|
|
1076
|
+
a replay lookup of a load job returns 404 for datasets outside the US and EU
|
|
1077
|
+
multi-regions, and the sink uploads again, gets a 409, and fails with a
|
|
1078
|
+
"check projectId and location" error. The sink warns once per process when
|
|
1079
|
+
`location` is unset.
|
|
1070
1080
|
- Stop old sink workers before relying on these overlap guarantees. If an
|
|
1071
1081
|
earlier overlapping run left a plan whose starting cursor differs from the
|
|
1072
1082
|
committed cursor, the sink rejects it before loading. Reconcile the retained
|
|
@@ -1230,7 +1240,7 @@ Managed-only changes are lifecycle candidates in their own right. A settlement,
|
|
|
1230
1240
|
|
|
1231
1241
|
`MAX_MATERIALIZATIONS_PER_ACCOUNT` and `MAX_RECEIPTS_PER_CONSUMER` are lifetime counts by default. Because managed evidence is immutable, a long-lived account eventually reaches them and then stops planning materializations and refuses every receipt with no way back. Construct the store with `new PostgresReportingManagedDeliveryStore(pool, { evidenceRetentionDays })` to make the caps active-scope: only evidence recorded inside that window counts against them, and `pruneExpiredEvidence({ account_id, limit })` deletes what has fallen outside it — never anything still inside the window, never a `pending` or leased materialization, and never a receipt batch inside its own replay retention. Retention has a floor: at least the 30-day receipt replay retention, and at least the strongest durable status or resource-retention horizon registered for the database. Adoption and binding installation exclusively lock the migration-created policy sentinel before account/binding locks; settlement, revocation claim, and pruning hold shared locks on it through their writes. A stronger promise therefore cannot land between a weaker check and its write, while unrelated hot-path readers remain concurrent. Pruning genuinely does its selection before taking the account lock, and asks which receipts a live replay row still names by expanding those rows once rather than posing a containment question per candidate — a shape no index could serve, which held the lock long enough to fail concurrent Core writes with 55P03. Because that selection is unlocked it is a proposal rather than a verdict: every victim is revalidated under the account lock against current live replay rows, surviving receipts and unexpired resources before it is deleted, so a replay that commits in the gap keeps the receipt it promised to reproduce. The revalidation is narrowed to the candidates' own consumers and keys, so the lock still holds no per-candidate scan. The registry lock is held to commit inside the transaction that acts on it, and a precondition such as the installed-window check runs inside that same transaction so a refusal rolls the write back rather than leaving a durable promise nobody validated, so an install cannot read an empty registry while a narrower promise is being registered, and a prune cannot approve a horizon another replica is about to widen. Pruning deletes and tombstones in one statement against one frozen cutoff, so a moving boundary can never leave a deleted row without its permanent identity. Successive prunes demote the tombstones they supersede, so a subject has exactly one tombstone still claiming to be its leaf and a chain pruned twice resolves the same way every time. Re-presenting a pruned receipt byte-identically answers `unchanged` with the instant the tombstone kept, resolves that receipt's own tombstone before any rule about its subject — so an exact re-presentation is not refused as new content for a settled subject — replays the same answer under the same idempotency key by rehydrating from the tombstone when the body is gone, counts as already-resolved for the batch's duplicate-subject rule, and never recreates the row: recreating it restarted the retention clock, undid the storage the prune reclaimed, and moved the published `received_at` to a moment the consumer never filed anything at. A pruned receipt ID can never bind different content, a subject whose accepted leaf expired can never reopen — the read projection consults tombstones, not just live rows — and materialization attempt history survives as a compact terminal record, so a revision that exhausted its attempts or already succeeded does not restart at attempt 1 once its rows age out. Both conclusions — the acceptance and the fact a delivery succeeded — are folded into the live, filtered and lifecycle projections alike. Counters describe exactly the records the response emits, never more and never less, so a buyer recomputing the association cannot see `ASSOCIATED_HISTORY_INCOMPLETE`; retention therefore refuses to prune an acceptance while the resource it accepts is still readable, which is what keeps a `complete` period from having nothing to show for itself. An acceptance carries the consumer that gave it, so one consumer's pruned acceptance never settles the obligation on another's behalf — including the anonymous fail-safe consumer, which owns no acceptances at all. Pruning also removes the expired replay row before the receipts it names, keeps any receipt a surviving replay row still references — a later batch can name an earlier receipt — and keeps any materialization whose resource is still readable or that a retained receipt names as its evidence. An adjustment receipt names no materialization — it names the revision it corrects — so the readable-resource hold matches on that revision as well, or a period whose revision resource was still readable lost the adjustment acceptance behind its own `complete`. Run it from the same scheduler that runs the worker. Lifecycle receipt reads are driven from the obligation's own subjects into a `(subject_id, receipt_kind, recorded_at)` index rather than asking the global receipt table which of its rows belong to an obligation — a question that supplies neither account nor consumer, so every due obligation re-scanned the whole receipt history. The managed state digest, the obligated-consumer roster read and the permanent delivery tombstones do the same — consumer statuses carry an `obligation_id` index and materialization tombstones an `(obligation_id, reached_success, reached_success_at)` one — because that digest is read inside the apply transaction while it holds the account lock: a scan there is a scan with the lock held, which pushed concurrent Core writes past their lock timeout and failed them with 55P03.
|
|
1232
1242
|
|
|
1233
|
-
The managed tables are additive and do not alter the Core tables. This is the schema boundary coordinated with
|
|
1243
|
+
The managed tables are additive and do not alter the Core tables. This is the schema boundary coordinated with the reporting notification work: that work owns transactional reporting notification/activity intent and the existing webhook delivery/credential plane. Managed Delivery does not create a second webhook sender, outbox, credential store, or subscriber model. Apply both feature migrations after the Core migration in either order; each owns separate tables and both reuse the Core authority.
|
|
1234
1244
|
|
|
1235
1245
|
## Transactional reporting notifications and account activity
|
|
1236
1246
|
|
|
@@ -1749,7 +1759,7 @@ reconciliation and fails closed if both are supplied, preventing double fire;
|
|
|
1749
1759
|
the port's pending rows, rather than `listPendingTransitions()`, own retry.
|
|
1750
1760
|
|
|
1751
1761
|
The activity table is deliberately separate from Core revision and obligation
|
|
1752
|
-
rows. Managed Delivery/Reconciled Billing work
|
|
1762
|
+
rows. Managed Delivery/Reconciled Billing work can add immutable
|
|
1753
1763
|
materialization and receipt tables without changing this transition identity,
|
|
1754
1764
|
queue schema, or migration ordering.
|
|
1755
1765
|
|
|
@@ -121,7 +121,14 @@ service runs for you. See
|
|
|
121
121
|
cannot hold the table indefinitely.
|
|
122
122
|
5. **Warehouse sink.** Apply `REPORTING_WAREHOUSE_SINK_MIGRATION`, create the
|
|
123
123
|
tables, and the `current_rows` view, then schedule `runOnce`. Point analysts
|
|
124
|
-
at `current_rows`.
|
|
124
|
+
at `current_rows`. Set the sink's `location` to the dataset's location: replay
|
|
125
|
+
lookups of load jobs need it outside the US and EU multi-regions, and the sink
|
|
126
|
+
warns once per process when it is unset. When upgrading from 15.9.0, stop
|
|
127
|
+
every 15.9.0 sink worker before starting newer ones, then re-apply
|
|
128
|
+
`REPORTING_WAREHOUSE_SINK_MIGRATION`. A 15.9.0 worker cancels a load at its
|
|
129
|
+
deadline, so one running beside a newer worker on the same sink can cancel a
|
|
130
|
+
job the newer worker is waiting on; the job ends `DONE` with an error and the
|
|
131
|
+
attempt advances. Rows do not duplicate, but convergence slows.
|
|
125
132
|
6. **Retention.** Enable `retention` last, after confirming the advertised
|
|
126
133
|
`status_retention_days` is the window you intend to keep. Retirement deletes
|
|
127
134
|
rows and ledger records for whole periods and cannot be undone. Keep backups
|
|
@@ -344,7 +351,7 @@ What it checks:
|
|
|
344
351
|
and job ID unchanged and that table's persisted deadline grown, the job must
|
|
345
352
|
end `DONE` without an error (the sink never cancels it), and later runs under
|
|
346
353
|
the same sink name must converge with no duplicate rows, the same job ID and
|
|
347
|
-
no second upload. A
|
|
354
|
+
no second upload. A slow-upload scenario runs a sink whose upload of a 50,000-row
|
|
348
355
|
batch outlasts its 1-second deadline and asserts that it converges within 8
|
|
349
356
|
runs, loads every row exactly once, never changes the job ID, and never
|
|
350
357
|
starts an upload after the job exists (a link fast enough to beat the
|
|
@@ -356,11 +363,10 @@ What it checks:
|
|
|
356
363
|
it; in practice it accepts the cancel and lets the load finish, which is why
|
|
357
364
|
the sink never cancels a load and finds it by job ID instead.
|
|
358
365
|
- **Overlapping runs** (`INFO`, never a failure). Two concurrent `runOnce()`
|
|
359
|
-
calls over one pending batch, and a deterministic reproduction of
|
|
366
|
+
calls over one pending batch, and a deterministic reproduction of the stale-plan race: one
|
|
360
367
|
run reads its sink state, another completes the batch and a new revision
|
|
361
368
|
commits, then the first resumes. Without the fence the first run reloads
|
|
362
|
-
revisions the second already loaded (duplicate rows); with the fence
|
|
363
|
-
PR #3197 it rejects as stale and nothing duplicates. Read the verdict in the
|
|
369
|
+
revisions the second already loaded (duplicate rows); with the plan fence it rejects as stale and nothing duplicates. Read the verdict in the
|
|
364
370
|
report; the exit status does not depend on it.
|
|
365
371
|
- **Cross-project.** Set `GCP_CLIENT_PROJECT` to a project other than
|
|
366
372
|
`GCP_BQ_PROJECT`. Load jobs are then created in the destination project, and
|
|
@@ -446,15 +452,15 @@ export GCS_BUCKET=my-test-bucket GCS_PREFIX=adcp-reporting-validation
|
|
|
446
452
|
npm run validate:reporting-gcp -- --yes
|
|
447
453
|
```
|
|
448
454
|
|
|
449
|
-
Against a pull request branch (
|
|
455
|
+
Against a pull request branch (replace `<n>` with its number), keep running the script from
|
|
450
456
|
`main` and point it at a second built checkout, so a branch cut before this
|
|
451
457
|
script existed still works:
|
|
452
458
|
|
|
453
459
|
```bash
|
|
454
|
-
git fetch origin pull
|
|
455
|
-
git worktree add ../adcp-client-pr
|
|
456
|
-
(cd ../adcp-client-pr
|
|
457
|
-
ADCP_SDK_ROOT=../adcp-client-pr
|
|
460
|
+
git fetch origin pull/<n>/head:pr-<n>
|
|
461
|
+
git worktree add ../adcp-client-pr-<n> pr-<n>
|
|
462
|
+
(cd ../adcp-client-pr-<n> && npm ci && npm run build)
|
|
463
|
+
ADCP_SDK_ROOT=../adcp-client-pr-<n> npm run validate:reporting-gcp -- --yes
|
|
458
464
|
```
|
|
459
465
|
|
|
460
466
|
The same environment applies. The run ends with a `PASS`, `FAIL` and `INFO`
|
|
@@ -462,7 +468,7 @@ report and a markdown block (project and bucket names masked) to paste into
|
|
|
462
468
|
the PR. The exit status is 0 with no `FAIL`, 1 with any `FAIL`, and 2 for a
|
|
463
469
|
configuration problem or a missing `--yes`. Results of the overlap probes are
|
|
464
470
|
`INFO` on purpose: on `main` expect the stale-run probe to report duplicates,
|
|
465
|
-
and on
|
|
471
|
+
and on a branch with the plan fence expect it to report none.
|
|
466
472
|
|
|
467
473
|
`test/lib/reporting-gcp-validation-pg.test.js` drives the script's core against
|
|
468
474
|
in-memory BigQuery and Storage doubles and a real PostgreSQL, so the logic,
|
package/docs/llms.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Ad Context Protocol (AdCP)
|
|
2
2
|
|
|
3
|
-
> Generated at: 2026-10-
|
|
4
|
-
> Library: @adcp/sdk v16.0.0-beta.
|
|
3
|
+
> Generated at: 2026-10-15
|
|
4
|
+
> Library: @adcp/sdk v16.0.0-beta.2
|
|
5
5
|
> AdCP major version: 3
|
|
6
6
|
> Canonical URL: https://adcontextprotocol.github.io/adcp-client/llms.txt
|
|
7
7
|
> Note: the `Library` stamp reflects the package.json version at doc-generation time. The narrative below describes the surface that lands on the next-published minor — including any 6.7 helpers documented here ahead of the release tag.
|
|
@@ -407,6 +407,14 @@ projected.format_options, { sellerProduct: storedProduct })`. An option is then
|
|
|
407
407
|
seller-declared exactly when the stored product's own `format_options[]` names
|
|
408
408
|
it, which is the rule the SDK applies after its own discovery.
|
|
409
409
|
|
|
410
|
+
The client reads that origin from the resolver function that
|
|
411
|
+
`canonicalFormatLegacyResolverFromRoutes()` returns. A resolver you build around
|
|
412
|
+
it, for example one that tries the stored routes and then another source, is a
|
|
413
|
+
different function and carries no origin unless you pass it through
|
|
414
|
+
`carryFormatOptionOrigins(composedResolver, routesResolver)`.
|
|
415
|
+
`canonicalFormatLegacyResolverFromCatalogSnapshots(snapshots, fallback)` already
|
|
416
|
+
carries its fallback's origin.
|
|
417
|
+
|
|
410
418
|
Compatibility consumers that must retain top-level `format_ids[]` while
|
|
411
419
|
publishing URL-free canonical declarations can use the additive projection:
|
|
412
420
|
|
|
@@ -11,8 +11,8 @@ below as the publication/deployment gate.
|
|
|
11
11
|
|
|
12
12
|
| Fact | Value |
|
|
13
13
|
| --- | --- |
|
|
14
|
-
| Exact npm package | `@adcp/sdk@16.0.0-beta.
|
|
15
|
-
| npm integrity | registry-derived after publication; run `npm view @adcp/sdk@16.0.0-beta.
|
|
14
|
+
| Exact npm package | `@adcp/sdk@16.0.0-beta.2` |
|
|
15
|
+
| npm integrity | registry-derived after publication; run `npm view @adcp/sdk@16.0.0-beta.2 dist.integrity` |
|
|
16
16
|
| Node.js runtime | `^20.19.0 || >=22.12.0` |
|
|
17
17
|
| Default AdCP wire release | `3.2.4` |
|
|
18
18
|
| Maintained wire releases | `v2.5`, `v2.6`, `v3`, `3.0.0`, `3.0`, `3.0.1`, `3.0.2`, `3.0.3`, `3.0.4`, `3.0.5`, `3.0.6`, `3.0.7`, `3.0.8`, `3.0.9`, `3.0.10`, `3.0.11`, `3.0.12`, `3.0.13`, `3.0.14`, `3.0.15`, `3.0.16`, `3.0.17`, `3.0.18`, `3.0.19`, `3.0.20`, `3.0.21`, `3.0.22`, `3.0.23`, `3.0.24`, `3.0.25`, `3.1.0`, `3.1`, `3.1.1`, `3.1.2`, `3.1.3`, `3.1.4`, `3.1.5`, `3.1.6`, `3.1.7`, `3.1.8`, `3.1.9`, `3.1.10`, `3.1.11`, `3.1.12`, `3.1.13`, `3.1.14`, `3.1.15`, `3.1.16`, `3.1.17`, `3.1.18`, `3.1.19`, `3.1.20`, `3.1.21`, `3.1.22`, `3.1.23`, `3.1.24`, `3.2.1`, `3.2`, `3.2.2`, `3.2.3`, `3.2.4` |
|
|
@@ -21,8 +21,8 @@ below as the publication/deployment gate.
|
|
|
21
21
|
Install exact production inputs rather than a moving range or dist-tag:
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
npm install --save-exact '@adcp/sdk@16.0.0-beta.
|
|
25
|
-
npm view '@adcp/sdk@16.0.0-beta.
|
|
24
|
+
npm install --save-exact '@adcp/sdk@16.0.0-beta.2'
|
|
25
|
+
npm view '@adcp/sdk@16.0.0-beta.2' dist.integrity
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
### Required and optional peers
|