@adcp/sdk 16.5.0 → 16.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/dist/lib/adapters/version/3.0/brand-fields.d.mts +7 -1
  2. package/dist/lib/adapters/version/3.0/brand-fields.d.ts +7 -1
  3. package/dist/lib/adapters/version/3.0/brand-fields.js +139 -3
  4. package/dist/lib/adapters/version/3.0/brand-fields.mjs +136 -2
  5. package/dist/lib/adapters/version/3.0/index.js +6 -0
  6. package/dist/lib/adapters/version/3.0/index.mjs +7 -1
  7. package/dist/lib/adapters/version/3.1/bidding.js +1 -1
  8. package/dist/lib/adapters/version/3.1/bidding.mjs +1 -1
  9. package/dist/lib/adapters/version/types.d.mts +5 -0
  10. package/dist/lib/adapters/version/types.d.ts +5 -0
  11. package/dist/lib/canonical-references/index.js +2 -0
  12. package/dist/lib/canonical-references/index.mjs +2 -0
  13. package/dist/lib/client/account-changes.d.mts +3 -1
  14. package/dist/lib/client/account-changes.d.ts +3 -1
  15. package/dist/lib/client/account-changes.js +22 -2
  16. package/dist/lib/client/account-changes.mjs +22 -2
  17. package/dist/lib/conformance/oracle.js +3 -2
  18. package/dist/lib/conformance/oracle.mjs +3 -2
  19. package/dist/lib/core/AgentClient.d.mts +165 -1
  20. package/dist/lib/core/AgentClient.d.ts +165 -1
  21. package/dist/lib/core/AgentClient.js +446 -8
  22. package/dist/lib/core/AgentClient.mjs +446 -8
  23. package/dist/lib/core/ConversationTypes.d.mts +8 -0
  24. package/dist/lib/core/ConversationTypes.d.ts +8 -0
  25. package/dist/lib/core/ProtocolResponseParser.d.mts +1 -1
  26. package/dist/lib/core/ProtocolResponseParser.d.ts +1 -1
  27. package/dist/lib/core/ProtocolResponseParser.js +28 -18
  28. package/dist/lib/core/ProtocolResponseParser.mjs +11 -1
  29. package/dist/lib/core/ResponseValidator.js +1 -1
  30. package/dist/lib/core/ResponseValidator.mjs +1 -1
  31. package/dist/lib/core/SingleAgentClient.d.mts +116 -6
  32. package/dist/lib/core/SingleAgentClient.d.ts +116 -6
  33. package/dist/lib/core/SingleAgentClient.js +556 -84
  34. package/dist/lib/core/SingleAgentClient.mjs +545 -72
  35. package/dist/lib/core/TaskExecutor.d.mts +7 -0
  36. package/dist/lib/core/TaskExecutor.d.ts +7 -0
  37. package/dist/lib/core/TaskExecutor.js +23 -8
  38. package/dist/lib/core/TaskExecutor.mjs +23 -8
  39. package/dist/lib/core/task-status.d.mts +2 -0
  40. package/dist/lib/core/task-status.d.ts +2 -0
  41. package/dist/lib/core/task-status.js +11 -2
  42. package/dist/lib/core/task-status.mjs +9 -1
  43. package/dist/lib/errors/index.d.mts +22 -0
  44. package/dist/lib/errors/index.d.ts +22 -0
  45. package/dist/lib/errors/index.js +43 -0
  46. package/dist/lib/errors/index.mjs +42 -0
  47. package/dist/lib/identity-3.3/trust.d.mts +1 -4
  48. package/dist/lib/identity-3.3/trust.d.ts +1 -4
  49. package/dist/lib/identity-3.3/trust.js +34 -21
  50. package/dist/lib/identity-3.3/trust.mjs +34 -21
  51. package/dist/lib/identity-3.3/validation.js +5 -3
  52. package/dist/lib/identity-3.3/validation.mjs +6 -4
  53. package/dist/lib/index.d.mts +8 -54
  54. package/dist/lib/index.d.ts +8 -54
  55. package/dist/lib/index.js +15 -0
  56. package/dist/lib/index.mjs +11 -0
  57. package/dist/lib/media-buy/action-assessment.js +29 -3
  58. package/dist/lib/media-buy/action-assessment.mjs +32 -4
  59. package/dist/lib/media-buy/action-contracts.d.mts +3 -0
  60. package/dist/lib/media-buy/action-contracts.d.ts +3 -0
  61. package/dist/lib/media-buy/action-contracts.js +24 -1
  62. package/dist/lib/media-buy/action-contracts.mjs +22 -1
  63. package/dist/lib/media-buy/compatibility.js +6 -1
  64. package/dist/lib/media-buy/compatibility.mjs +6 -1
  65. package/dist/lib/media-buy/preflight.js +1 -1
  66. package/dist/lib/media-buy/preflight.mjs +3 -2
  67. package/dist/lib/media-buy/types.d.mts +6 -1
  68. package/dist/lib/media-buy/types.d.ts +6 -1
  69. package/dist/lib/protocols/mcp-modern.d.mts +2 -0
  70. package/dist/lib/protocols/mcp-modern.d.ts +2 -0
  71. package/dist/lib/protocols/mcp-modern.js +31 -5
  72. package/dist/lib/protocols/mcp-modern.mjs +31 -5
  73. package/dist/lib/protocols/mcp-scope.d.mts +6 -1
  74. package/dist/lib/protocols/mcp-scope.d.ts +6 -1
  75. package/dist/lib/protocols/mcp-scope.js +25 -3
  76. package/dist/lib/protocols/mcp-scope.mjs +24 -3
  77. package/dist/lib/protocols/mcp.js +12 -6
  78. package/dist/lib/protocols/mcp.mjs +13 -6
  79. package/dist/lib/reporting/inspection.js +1 -0
  80. package/dist/lib/reporting/inspection.mjs +1 -0
  81. package/dist/lib/schemas/browser.d.mts +2 -0
  82. package/dist/lib/schemas/browser.d.ts +2 -0
  83. package/dist/lib/schemas/browser.js +3 -0
  84. package/dist/lib/schemas/browser.mjs +2 -0
  85. package/dist/lib/schemas/index.d.mts +5 -2
  86. package/dist/lib/schemas/index.d.ts +5 -2
  87. package/dist/lib/schemas/index.js +5 -0
  88. package/dist/lib/schemas/index.mjs +4 -0
  89. package/dist/lib/server/account-response-identity.d.mts +17 -0
  90. package/dist/lib/server/account-response-identity.d.ts +17 -0
  91. package/dist/lib/server/account-response-identity.js +52 -0
  92. package/dist/lib/server/account-response-identity.mjs +28 -0
  93. package/dist/lib/server/account-sync-contract.js +1 -0
  94. package/dist/lib/server/account-sync-contract.mjs +1 -0
  95. package/dist/lib/server/create-adcp-server.js +32 -19
  96. package/dist/lib/server/create-adcp-server.mjs +36 -12
  97. package/dist/lib/server/decisioning/account.d.mts +13 -6
  98. package/dist/lib/server/decisioning/account.d.ts +13 -6
  99. package/dist/lib/server/decisioning/account.js +37 -15
  100. package/dist/lib/server/decisioning/account.mjs +37 -15
  101. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +5 -5
  102. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +5 -5
  103. package/dist/lib/server/decisioning/runtime/from-platform.js +6 -6
  104. package/dist/lib/server/decisioning/runtime/from-platform.mjs +6 -6
  105. package/dist/lib/server/index.d.mts +1 -1
  106. package/dist/lib/server/index.d.ts +1 -1
  107. package/dist/lib/server/index.js +2 -0
  108. package/dist/lib/server/index.mjs +2 -0
  109. package/dist/lib/server/media-buy-action-resolver.d.mts +3 -0
  110. package/dist/lib/server/media-buy-action-resolver.d.ts +3 -0
  111. package/dist/lib/server/media-buy-action-resolver.js +32 -0
  112. package/dist/lib/server/media-buy-action-resolver.mjs +32 -0
  113. package/dist/lib/server/media-buy-store.d.mts +26 -12
  114. package/dist/lib/server/media-buy-store.d.ts +26 -12
  115. package/dist/lib/server/media-buy-store.js +69 -21
  116. package/dist/lib/server/media-buy-store.mjs +69 -21
  117. package/dist/lib/server/responses.js +9 -1
  118. package/dist/lib/server/responses.mjs +9 -1
  119. package/dist/lib/server/state-machine.d.mts +10 -11
  120. package/dist/lib/server/state-machine.d.ts +10 -11
  121. package/dist/lib/server/state-machine.js +20 -5
  122. package/dist/lib/server/state-machine.mjs +19 -5
  123. package/dist/lib/signing/agent-fetch.d.mts +1 -1
  124. package/dist/lib/signing/agent-fetch.d.ts +1 -1
  125. package/dist/lib/signing/agent-fetch.js +3 -3
  126. package/dist/lib/signing/agent-fetch.mjs +3 -3
  127. package/dist/lib/testing/client.d.mts +1 -0
  128. package/dist/lib/testing/client.d.ts +1 -0
  129. package/dist/lib/testing/client.js +6 -5
  130. package/dist/lib/testing/client.mjs +6 -5
  131. package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +60 -14
  132. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +60 -14
  133. package/dist/lib/testing/storyboard/compliance.d.mts +2 -5
  134. package/dist/lib/testing/storyboard/compliance.d.ts +2 -5
  135. package/dist/lib/testing/storyboard/compliance.js +62 -13
  136. package/dist/lib/testing/storyboard/compliance.mjs +63 -14
  137. package/dist/lib/testing/storyboard/context.d.mts +13 -3
  138. package/dist/lib/testing/storyboard/context.d.ts +13 -3
  139. package/dist/lib/testing/storyboard/context.js +15 -10
  140. package/dist/lib/testing/storyboard/context.mjs +15 -10
  141. package/dist/lib/testing/storyboard/default-invariants.js +10 -8
  142. package/dist/lib/testing/storyboard/default-invariants.mjs +11 -9
  143. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.mts +2 -0
  144. package/dist/lib/testing/storyboard/request-signing/vector-loader.d.ts +2 -0
  145. package/dist/lib/testing/storyboard/request-signing/vector-loader.js +11 -0
  146. package/dist/lib/testing/storyboard/request-signing/vector-loader.mjs +10 -0
  147. package/dist/lib/testing/storyboard/runner.js +23 -10
  148. package/dist/lib/testing/storyboard/runner.mjs +23 -10
  149. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  150. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  151. package/dist/lib/testing/storyboard/validations.js +4 -1
  152. package/dist/lib/testing/storyboard/validations.mjs +4 -1
  153. package/dist/lib/testing/test-controller.js +3 -0
  154. package/dist/lib/testing/test-controller.mjs +3 -0
  155. package/dist/lib/types/asset-instances.d.mts +1 -1
  156. package/dist/lib/types/asset-instances.d.ts +1 -1
  157. package/dist/lib/types/index.d.mts +5 -0
  158. package/dist/lib/types/index.d.ts +5 -0
  159. package/dist/lib/types/index.js +6 -1
  160. package/dist/lib/types/index.mjs +4 -1
  161. package/dist/lib/types/inline-enums.generated.d.mts +30 -4
  162. package/dist/lib/types/inline-enums.generated.d.ts +30 -4
  163. package/dist/lib/types/inline-enums.generated.js +41 -2
  164. package/dist/lib/types/inline-enums.generated.mjs +28 -2
  165. package/dist/lib/types/media-buy-delivery-report.d.mts +4 -0
  166. package/dist/lib/types/media-buy-delivery-report.d.ts +4 -0
  167. package/dist/lib/types/media-buy-delivery-report.js +16 -0
  168. package/dist/lib/types/media-buy-delivery-report.mjs +0 -0
  169. package/dist/lib/types/schemas.generated.d.ts +20 -69
  170. package/dist/lib/types/schemas.generated.js +29 -46
  171. package/dist/lib/types/schemas.generated.mjs +29 -46
  172. package/dist/lib/types/targeting-keys.generated.d.mts +4 -0
  173. package/dist/lib/types/targeting-keys.generated.d.ts +4 -0
  174. package/dist/lib/types/targeting-keys.generated.js +105 -0
  175. package/dist/lib/types/targeting-keys.generated.mjs +80 -0
  176. package/dist/lib/utils/adcp-version-config.js +5 -2
  177. package/dist/lib/utils/adcp-version-config.mjs +5 -2
  178. package/dist/lib/utils/envelope-status-compat.d.mts +18 -1
  179. package/dist/lib/utils/envelope-status-compat.d.ts +18 -1
  180. package/dist/lib/utils/envelope-status-compat.js +11 -5
  181. package/dist/lib/utils/envelope-status-compat.mjs +11 -5
  182. package/dist/lib/utils/response-unwrapper.js +18 -10
  183. package/dist/lib/utils/response-unwrapper.mjs +18 -10
  184. package/dist/lib/v2/format-schema/resolver.js +1 -1
  185. package/dist/lib/v2/format-schema/resolver.mjs +1 -1
  186. package/dist/lib/v2/projection/creative-delivery.js +123 -30
  187. package/dist/lib/v2/projection/creative-delivery.mjs +127 -30
  188. package/dist/lib/v2/projection/index.d.mts +1 -0
  189. package/dist/lib/v2/projection/index.d.ts +1 -0
  190. package/dist/lib/v2/projection/index.js +3 -0
  191. package/dist/lib/v2/projection/index.mjs +2 -0
  192. package/dist/lib/v2/projection/legacy-metadata.d.mts +19 -0
  193. package/dist/lib/v2/projection/legacy-metadata.d.ts +19 -0
  194. package/dist/lib/v2/projection/legacy-metadata.js +91 -0
  195. package/dist/lib/v2/projection/legacy-metadata.mjs +86 -0
  196. package/dist/lib/validation/compact-schema.d.mts +27 -0
  197. package/dist/lib/validation/compact-schema.d.ts +27 -0
  198. package/dist/lib/validation/compact-schema.js +276 -0
  199. package/dist/lib/validation/compact-schema.mjs +250 -0
  200. package/dist/lib/validation/media-buy-delivery-report.d.mts +8 -0
  201. package/dist/lib/validation/media-buy-delivery-report.d.ts +8 -0
  202. package/dist/lib/validation/media-buy-delivery-report.js +31 -0
  203. package/dist/lib/validation/media-buy-delivery-report.mjs +7 -0
  204. package/dist/lib/validation/schema-diagnostic-origins.d.mts +21 -0
  205. package/dist/lib/validation/schema-diagnostic-origins.d.ts +21 -0
  206. package/dist/lib/validation/schema-diagnostic-origins.js +193 -0
  207. package/dist/lib/validation/schema-diagnostic-origins.mjs +169 -0
  208. package/dist/lib/validation/schema-loader.js +86 -16
  209. package/dist/lib/validation/schema-loader.mjs +82 -16
  210. package/dist/lib/validation/schema-validator.d.mts +10 -19
  211. package/dist/lib/validation/schema-validator.d.ts +10 -19
  212. package/dist/lib/validation/schema-validator.js +136 -43
  213. package/dist/lib/validation/schema-validator.mjs +140 -44
  214. package/dist/lib/version.d.mts +3 -3
  215. package/dist/lib/version.d.ts +3 -3
  216. package/dist/lib/version.js +3 -3
  217. package/dist/lib/version.mjs +3 -3
  218. package/dist/lib/webhooks/index.d.mts +3 -0
  219. package/dist/lib/webhooks/index.d.ts +3 -0
  220. package/dist/lib/webhooks/index.js +3 -0
  221. package/dist/lib/webhooks/index.mjs +2 -0
  222. package/dist/lib/webhooks/media-buy-delivery.d.mts +43 -0
  223. package/dist/lib/webhooks/media-buy-delivery.d.ts +43 -0
  224. package/dist/lib/webhooks/media-buy-delivery.js +119 -0
  225. package/dist/lib/webhooks/media-buy-delivery.mjs +94 -0
  226. package/docs/TYPE-SUMMARY.md +2 -2
  227. package/docs/guides/BUILD-AN-AGENT.md +9 -1
  228. package/docs/guides/DELIVERY-WEBHOOK-PARSING.md +135 -0
  229. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +15 -0
  230. package/docs/guides/TYPED-CLIENT-TOOLS.md +49 -0
  231. package/docs/llms.txt +3 -3
  232. package/docs/migration-14.x-rc-worksheet.md +4 -4
  233. package/docs/migration-6.6-to-6.7.md +14 -0
  234. package/docs/migration-account-change-feed.md +19 -0
  235. package/docs/releases/sdk-16.6-adoption-fixes.md +33 -0
  236. package/package.json +2 -2
@@ -20,8 +20,12 @@ var legacy_metadata_exports = {};
20
20
  __export(legacy_metadata_exports, {
21
21
  concealLegacyFormatRefs: () => concealLegacyFormatRefs,
22
22
  concealSelectedFormatOptions: () => concealSelectedFormatOptions,
23
+ downgradePixelTracker: () => downgradePixelTracker,
24
+ getCreativeDeliveryDiagnostics: () => getCreativeDeliveryDiagnostics,
23
25
  isSynthesizedFormatOption: () => isSynthesizedFormatOption,
24
26
  legacyFormatRefsForDeclaration: () => legacyFormatRefsForDeclaration,
27
+ pixelTrackerDrift: () => pixelTrackerDrift,
28
+ rememberCreativeDeliveryDiagnostics: () => rememberCreativeDeliveryDiagnostics,
25
29
  rememberSellerDeclaredFormatOption: () => rememberSellerDeclaredFormatOption,
26
30
  rememberSellerFormatEvidence: () => rememberSellerFormatEvidence,
27
31
  rememberSynthesizedFormatOption: () => rememberSynthesizedFormatOption,
@@ -29,10 +33,90 @@ __export(legacy_metadata_exports, {
29
33
  sellerDeclaredFormatOption: () => sellerDeclaredFormatOption,
30
34
  sellerFormatEvidence: () => sellerFormatEvidence,
31
35
  structuredCloneWithLegacyCreativeMetadata: () => structuredCloneWithLegacyCreativeMetadata,
36
+ transferCreativeDeliveryDiagnostics: () => transferCreativeDeliveryDiagnostics,
32
37
  transferLegacyCreativeMetadata: () => transferLegacyCreativeMetadata
33
38
  });
34
39
  module.exports = __toCommonJS(legacy_metadata_exports);
35
40
  var import_jcs = require('../../utils/jcs.js');
41
+ const diagnostics = /* @__PURE__ */ new WeakMap();
42
+ function downgradePixelTracker(value) {
43
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
44
+ const asset = value;
45
+ if (asset.asset_type !== "pixel_tracker" || typeof asset.url !== "string") return void 0;
46
+ if (asset.method !== void 0 && asset.method !== "img" && asset.method !== "js") return void 0;
47
+ let assetId;
48
+ const lostFields = [];
49
+ switch (asset.event) {
50
+ case "impression":
51
+ assetId = "impression_tracker";
52
+ break;
53
+ case "click":
54
+ assetId = "click_tracker";
55
+ break;
56
+ case "viewable_mrc_50":
57
+ case "viewable_mrc_100":
58
+ case "viewable_video_50":
59
+ case "audible_video_complete":
60
+ assetId = "viewability_tracker";
61
+ lostFields.push("event");
62
+ break;
63
+ case "custom":
64
+ if (typeof asset.custom_event_name !== "string" || asset.custom_event_name.length === 0) return void 0;
65
+ assetId = "impression_tracker";
66
+ lostFields.push("event", "custom_event_name");
67
+ break;
68
+ default:
69
+ return void 0;
70
+ }
71
+ if (asset.method === "js") lostFields.push("method");
72
+ const { event: _event, method: _method, custom_event_name: _custom, ...rest } = asset;
73
+ return { asset: { ...rest, asset_type: "url", url_type: "tracker_pixel" }, assetId, lostFields };
74
+ }
75
+ function pixelTrackerDrift(path, tracker) {
76
+ if (tracker.lostFields.length === 0) return void 0;
77
+ return {
78
+ type: "PIXEL_TRACKER_LOSSY_DOWNGRADE",
79
+ message: `${path} converted to a legacy URL tracker. ` + (tracker.lostFields.includes("event") ? "The original event variant or custom timing is not represented. " : "") + (tracker.lostFields.includes("method") ? "The URL is requested as an image; its JavaScript does not execute. " : "") + "AdCP 3.0 cannot preserve these tracker semantics.",
80
+ strippedFields: tracker.lostFields.map((field) => `${path}.${field}`)
81
+ };
82
+ }
83
+ function rememberCreativeDeliveryDiagnostics(value, entries) {
84
+ if (entries.length === 0) return;
85
+ const combined = [...diagnostics.get(value) ?? [], ...entries];
86
+ diagnostics.set(value, [...new Map(combined.map((entry) => [JSON.stringify(entry), entry])).values()]);
87
+ }
88
+ function transferCreativeDeliveryDiagnostics(source, target) {
89
+ const entries = diagnostics.get(source);
90
+ if (entries) rememberCreativeDeliveryDiagnostics(target, entries);
91
+ }
92
+ function getCreativeDeliveryDiagnostics(value) {
93
+ const result = [];
94
+ const append = (creative, prefix) => {
95
+ if (!creative || typeof creative !== "object") return;
96
+ for (const entry of diagnostics.get(creative) ?? []) {
97
+ result.push({
98
+ ...entry,
99
+ message: prefix ? `${prefix}: ${entry.message}` : entry.message,
100
+ strippedFields: entry.strippedFields?.map((field) => `${prefix}${prefix ? "." : ""}${field}`)
101
+ });
102
+ }
103
+ };
104
+ append(value, "");
105
+ if (!value || typeof value !== "object" || Array.isArray(value)) return result;
106
+ const request = value;
107
+ const creatives = (items, prefix) => {
108
+ if (Array.isArray(items)) items.forEach((item, index) => append(item, `${prefix}[${index}]`));
109
+ };
110
+ creatives(request.creatives, "creatives");
111
+ for (const field of ["packages", "new_packages"]) {
112
+ const packages = request[field];
113
+ if (!Array.isArray(packages)) continue;
114
+ packages.forEach((pkg, index) => {
115
+ if (pkg && typeof pkg === "object") creatives(pkg.creatives, `${field}[${index}].creatives`);
116
+ });
117
+ }
118
+ return result;
119
+ }
36
120
  const legacyRefsByDeclaration = /* @__PURE__ */ new WeakMap();
37
121
  const selectedOptionsByRefs = /* @__PURE__ */ new WeakMap();
38
122
  const sellerDeclaredByDeclaration = /* @__PURE__ */ new WeakMap();
@@ -101,6 +185,7 @@ function concealSelectedFormatOptions(refs, declarations) {
101
185
  selectedOptionsByRefs.set(refs, declarations);
102
186
  }
103
187
  function transferLegacyCreativeMetadata(source, target) {
188
+ transferCreativeDeliveryDiagnostics(source, target);
104
189
  const refs = legacyRefsByDeclaration.get(source);
105
190
  if (refs) legacyRefsByDeclaration.set(target, refs);
106
191
  const selected = selectedOptionsByRefs.get(source);
@@ -114,6 +199,7 @@ function structuredCloneWithLegacyCreativeMetadata(value) {
114
199
  const clone = structuredClone(value);
115
200
  const visited = /* @__PURE__ */ new WeakMap();
116
201
  const snapshotMetadata = (source, target) => {
202
+ transferCreativeDeliveryDiagnostics(source, target);
117
203
  const declared = sellerDeclaredByDeclaration.get(source);
118
204
  if (declared !== void 0) sellerDeclaredByDeclaration.set(target, declared);
119
205
  const evidence = sellerEvidenceByDeclaration.get(source);
@@ -155,8 +241,12 @@ function structuredCloneWithLegacyCreativeMetadata(value) {
155
241
  0 && (module.exports = {
156
242
  concealLegacyFormatRefs,
157
243
  concealSelectedFormatOptions,
244
+ downgradePixelTracker,
245
+ getCreativeDeliveryDiagnostics,
158
246
  isSynthesizedFormatOption,
159
247
  legacyFormatRefsForDeclaration,
248
+ pixelTrackerDrift,
249
+ rememberCreativeDeliveryDiagnostics,
160
250
  rememberSellerDeclaredFormatOption,
161
251
  rememberSellerFormatEvidence,
162
252
  rememberSynthesizedFormatOption,
@@ -164,5 +254,6 @@ function structuredCloneWithLegacyCreativeMetadata(value) {
164
254
  sellerDeclaredFormatOption,
165
255
  sellerFormatEvidence,
166
256
  structuredCloneWithLegacyCreativeMetadata,
257
+ transferCreativeDeliveryDiagnostics,
167
258
  transferLegacyCreativeMetadata
168
259
  });
@@ -1,4 +1,83 @@
1
1
  import { canonicalize } from "../../utils/jcs.mjs";
2
+ const diagnostics = /* @__PURE__ */ new WeakMap();
3
+ function downgradePixelTracker(value) {
4
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
5
+ const asset = value;
6
+ if (asset.asset_type !== "pixel_tracker" || typeof asset.url !== "string") return void 0;
7
+ if (asset.method !== void 0 && asset.method !== "img" && asset.method !== "js") return void 0;
8
+ let assetId;
9
+ const lostFields = [];
10
+ switch (asset.event) {
11
+ case "impression":
12
+ assetId = "impression_tracker";
13
+ break;
14
+ case "click":
15
+ assetId = "click_tracker";
16
+ break;
17
+ case "viewable_mrc_50":
18
+ case "viewable_mrc_100":
19
+ case "viewable_video_50":
20
+ case "audible_video_complete":
21
+ assetId = "viewability_tracker";
22
+ lostFields.push("event");
23
+ break;
24
+ case "custom":
25
+ if (typeof asset.custom_event_name !== "string" || asset.custom_event_name.length === 0) return void 0;
26
+ assetId = "impression_tracker";
27
+ lostFields.push("event", "custom_event_name");
28
+ break;
29
+ default:
30
+ return void 0;
31
+ }
32
+ if (asset.method === "js") lostFields.push("method");
33
+ const { event: _event, method: _method, custom_event_name: _custom, ...rest } = asset;
34
+ return { asset: { ...rest, asset_type: "url", url_type: "tracker_pixel" }, assetId, lostFields };
35
+ }
36
+ function pixelTrackerDrift(path, tracker) {
37
+ if (tracker.lostFields.length === 0) return void 0;
38
+ return {
39
+ type: "PIXEL_TRACKER_LOSSY_DOWNGRADE",
40
+ message: `${path} converted to a legacy URL tracker. ` + (tracker.lostFields.includes("event") ? "The original event variant or custom timing is not represented. " : "") + (tracker.lostFields.includes("method") ? "The URL is requested as an image; its JavaScript does not execute. " : "") + "AdCP 3.0 cannot preserve these tracker semantics.",
41
+ strippedFields: tracker.lostFields.map((field) => `${path}.${field}`)
42
+ };
43
+ }
44
+ function rememberCreativeDeliveryDiagnostics(value, entries) {
45
+ if (entries.length === 0) return;
46
+ const combined = [...diagnostics.get(value) ?? [], ...entries];
47
+ diagnostics.set(value, [...new Map(combined.map((entry) => [JSON.stringify(entry), entry])).values()]);
48
+ }
49
+ function transferCreativeDeliveryDiagnostics(source, target) {
50
+ const entries = diagnostics.get(source);
51
+ if (entries) rememberCreativeDeliveryDiagnostics(target, entries);
52
+ }
53
+ function getCreativeDeliveryDiagnostics(value) {
54
+ const result = [];
55
+ const append = (creative, prefix) => {
56
+ if (!creative || typeof creative !== "object") return;
57
+ for (const entry of diagnostics.get(creative) ?? []) {
58
+ result.push({
59
+ ...entry,
60
+ message: prefix ? `${prefix}: ${entry.message}` : entry.message,
61
+ strippedFields: entry.strippedFields?.map((field) => `${prefix}${prefix ? "." : ""}${field}`)
62
+ });
63
+ }
64
+ };
65
+ append(value, "");
66
+ if (!value || typeof value !== "object" || Array.isArray(value)) return result;
67
+ const request = value;
68
+ const creatives = (items, prefix) => {
69
+ if (Array.isArray(items)) items.forEach((item, index) => append(item, `${prefix}[${index}]`));
70
+ };
71
+ creatives(request.creatives, "creatives");
72
+ for (const field of ["packages", "new_packages"]) {
73
+ const packages = request[field];
74
+ if (!Array.isArray(packages)) continue;
75
+ packages.forEach((pkg, index) => {
76
+ if (pkg && typeof pkg === "object") creatives(pkg.creatives, `${field}[${index}].creatives`);
77
+ });
78
+ }
79
+ return result;
80
+ }
2
81
  const legacyRefsByDeclaration = /* @__PURE__ */ new WeakMap();
3
82
  const selectedOptionsByRefs = /* @__PURE__ */ new WeakMap();
4
83
  const sellerDeclaredByDeclaration = /* @__PURE__ */ new WeakMap();
@@ -67,6 +146,7 @@ function concealSelectedFormatOptions(refs, declarations) {
67
146
  selectedOptionsByRefs.set(refs, declarations);
68
147
  }
69
148
  function transferLegacyCreativeMetadata(source, target) {
149
+ transferCreativeDeliveryDiagnostics(source, target);
70
150
  const refs = legacyRefsByDeclaration.get(source);
71
151
  if (refs) legacyRefsByDeclaration.set(target, refs);
72
152
  const selected = selectedOptionsByRefs.get(source);
@@ -80,6 +160,7 @@ function structuredCloneWithLegacyCreativeMetadata(value) {
80
160
  const clone = structuredClone(value);
81
161
  const visited = /* @__PURE__ */ new WeakMap();
82
162
  const snapshotMetadata = (source, target) => {
163
+ transferCreativeDeliveryDiagnostics(source, target);
83
164
  const declared = sellerDeclaredByDeclaration.get(source);
84
165
  if (declared !== void 0) sellerDeclaredByDeclaration.set(target, declared);
85
166
  const evidence = sellerEvidenceByDeclaration.get(source);
@@ -120,8 +201,12 @@ function structuredCloneWithLegacyCreativeMetadata(value) {
120
201
  export {
121
202
  concealLegacyFormatRefs,
122
203
  concealSelectedFormatOptions,
204
+ downgradePixelTracker,
205
+ getCreativeDeliveryDiagnostics,
123
206
  isSynthesizedFormatOption,
124
207
  legacyFormatRefsForDeclaration,
208
+ pixelTrackerDrift,
209
+ rememberCreativeDeliveryDiagnostics,
125
210
  rememberSellerDeclaredFormatOption,
126
211
  rememberSellerFormatEvidence,
127
212
  rememberSynthesizedFormatOption,
@@ -129,5 +214,6 @@ export {
129
214
  sellerDeclaredFormatOption,
130
215
  sellerFormatEvidence,
131
216
  structuredCloneWithLegacyCreativeMetadata,
217
+ transferCreativeDeliveryDiagnostics,
132
218
  transferLegacyCreativeMetadata
133
219
  };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Convert a mostly dereferenced bundled JSON Schema into a serializable schema
3
+ * that stores repeated schema nodes once under `$defs`.
4
+ *
5
+ * The upstream `bundled/` tree expands shared definitions at every use site,
6
+ * growing to hundreds of megabytes. This serializer replaces repeated schema
7
+ * nodes with private local refs while leaving annotation/default/example data
8
+ * alone. Public schema readers expand these private refs; validation can keep
9
+ * them to compile small referenced functions instead of multi-megabyte code.
10
+ */
11
+ type JsonObject = Record<string, unknown>;
12
+ export declare const COMPACT_DEFINITIONS_KEY = "x-adcp-compact-definitions";
13
+ /**
14
+ * Compact an acyclic schema object graph. Repeated schemas become private local
15
+ * `$defs` refs. The archive reader expands those private refs before exposing
16
+ * a schema, preserving the original document and AJV diagnostic paths.
17
+ */
18
+ export declare function compactBundledSchema(root: JsonObject, options?: {
19
+ maxInlineSchemaBytes?: number;
20
+ }): JsonObject;
21
+ /**
22
+ * Prepare a self-contained bundled schema for bounded AJV compilation. Nested
23
+ * IDs in these dereferenced bundles are source annotations, not ref scopes.
24
+ * Walk schema positions only so IDs in enum/default/example data stay intact.
25
+ */
26
+ export declare function compactSchemaForValidation(schema: JsonObject): JsonObject;
27
+ export {};
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Convert a mostly dereferenced bundled JSON Schema into a serializable schema
3
+ * that stores repeated schema nodes once under `$defs`.
4
+ *
5
+ * The upstream `bundled/` tree expands shared definitions at every use site,
6
+ * growing to hundreds of megabytes. This serializer replaces repeated schema
7
+ * nodes with private local refs while leaving annotation/default/example data
8
+ * alone. Public schema readers expand these private refs; validation can keep
9
+ * them to compile small referenced functions instead of multi-megabyte code.
10
+ */
11
+ type JsonObject = Record<string, unknown>;
12
+ export declare const COMPACT_DEFINITIONS_KEY = "x-adcp-compact-definitions";
13
+ /**
14
+ * Compact an acyclic schema object graph. Repeated schemas become private local
15
+ * `$defs` refs. The archive reader expands those private refs before exposing
16
+ * a schema, preserving the original document and AJV diagnostic paths.
17
+ */
18
+ export declare function compactBundledSchema(root: JsonObject, options?: {
19
+ maxInlineSchemaBytes?: number;
20
+ }): JsonObject;
21
+ /**
22
+ * Prepare a self-contained bundled schema for bounded AJV compilation. Nested
23
+ * IDs in these dereferenced bundles are source annotations, not ref scopes.
24
+ * Walk schema positions only so IDs in enum/default/example data stay intact.
25
+ */
26
+ export declare function compactSchemaForValidation(schema: JsonObject): JsonObject;
27
+ export {};
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var compact_schema_exports = {};
20
+ __export(compact_schema_exports, {
21
+ COMPACT_DEFINITIONS_KEY: () => COMPACT_DEFINITIONS_KEY,
22
+ compactBundledSchema: () => compactBundledSchema,
23
+ compactSchemaForValidation: () => compactSchemaForValidation
24
+ });
25
+ module.exports = __toCommonJS(compact_schema_exports);
26
+ var import_node_crypto = require("node:crypto");
27
+ const COMPACT_DEFINITIONS_KEY = "x-adcp-compact-definitions";
28
+ const SCHEMA_MAP_KEYWORDS = /* @__PURE__ */ new Set(["properties", "patternProperties", "$defs", "definitions", "dependentSchemas"]);
29
+ const SCHEMA_ARRAY_KEYWORDS = /* @__PURE__ */ new Set(["allOf", "anyOf", "oneOf", "prefixItems"]);
30
+ const SCHEMA_VALUE_KEYWORDS = /* @__PURE__ */ new Set([
31
+ "additionalProperties",
32
+ "additionalItems",
33
+ "contains",
34
+ "if",
35
+ "then",
36
+ "else",
37
+ "not",
38
+ "propertyNames",
39
+ "contentSchema",
40
+ "unevaluatedProperties",
41
+ "unevaluatedItems"
42
+ ]);
43
+ function isObject(value) {
44
+ return value !== null && typeof value === "object" && !Array.isArray(value);
45
+ }
46
+ function forEachChildSchema(schema, visit) {
47
+ for (const [keyword, value] of Object.entries(schema)) {
48
+ if (SCHEMA_MAP_KEYWORDS.has(keyword) && isObject(value)) {
49
+ for (const child of Object.values(value)) visit(child);
50
+ } else if (SCHEMA_ARRAY_KEYWORDS.has(keyword) && Array.isArray(value)) {
51
+ for (const child of value) visit(child);
52
+ } else if (SCHEMA_VALUE_KEYWORDS.has(keyword)) {
53
+ visit(value);
54
+ } else if (keyword === "items") {
55
+ if (Array.isArray(value)) {
56
+ for (const child of value) visit(child);
57
+ } else {
58
+ visit(value);
59
+ }
60
+ } else if (keyword === "dependencies" && isObject(value)) {
61
+ for (const child of Object.values(value)) {
62
+ if (!Array.isArray(child)) visit(child);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ function cloneData(value) {
68
+ if (Array.isArray(value)) return value.map(cloneData);
69
+ if (!isObject(value)) return value;
70
+ return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, cloneData(child)]));
71
+ }
72
+ function compactBundledSchema(root, options = {}) {
73
+ const referenceCounts = /* @__PURE__ */ new Map();
74
+ const visited = /* @__PURE__ */ new Set();
75
+ const countSchema = (value) => {
76
+ if (!isObject(value)) return;
77
+ referenceCounts.set(value, (referenceCounts.get(value) ?? 0) + 1);
78
+ if (visited.has(value)) return;
79
+ visited.add(value);
80
+ forEachChildSchema(value, countSchema);
81
+ };
82
+ countSchema(root);
83
+ const pointerAddressedNodes = /* @__PURE__ */ new Set();
84
+ const unionAlternatives = /* @__PURE__ */ new Set();
85
+ if (options.maxInlineSchemaBytes !== void 0) {
86
+ const rootUrl = new URL(typeof root.$id === "string" ? root.$id : "", "https://adcp.invalid/");
87
+ rootUrl.hash = "";
88
+ for (const schema of visited) {
89
+ for (const keyword of ["oneOf", "anyOf"]) {
90
+ const alternatives = schema[keyword];
91
+ if (Array.isArray(alternatives)) {
92
+ for (const alternative of alternatives) if (isObject(alternative)) unionAlternatives.add(alternative);
93
+ }
94
+ }
95
+ if (typeof schema.$ref !== "string") continue;
96
+ let fragment;
97
+ try {
98
+ const target = new URL(schema.$ref, rootUrl);
99
+ fragment = decodeURIComponent(target.hash.slice(1));
100
+ target.hash = "";
101
+ if (target.href !== rootUrl.href || !fragment.startsWith("/")) continue;
102
+ } catch {
103
+ continue;
104
+ }
105
+ let value = root;
106
+ for (const segment of fragment.slice(1).split("/")) {
107
+ if (isObject(value)) pointerAddressedNodes.add(value);
108
+ if (!isObject(value) && !Array.isArray(value)) break;
109
+ const key = segment.replace(/~1/g, "/").replace(/~0/g, "~");
110
+ value = value[key];
111
+ }
112
+ if (isObject(value)) pointerAddressedNodes.add(value);
113
+ }
114
+ }
115
+ const signatureCache = /* @__PURE__ */ new Map();
116
+ const weightCache = /* @__PURE__ */ new Map();
117
+ const schemaSignature = (schema) => {
118
+ const cached = signatureCache.get(schema);
119
+ if (cached) return cached;
120
+ const hash = (0, import_node_crypto.createHash)("sha256");
121
+ const updateHash = (value) => {
122
+ hash.update(`${Buffer.byteLength(value)}:`);
123
+ hash.update(value);
124
+ };
125
+ let weight = 2;
126
+ for (const [keyword, value] of Object.entries(schema)) {
127
+ updateHash(keyword);
128
+ if (SCHEMA_MAP_KEYWORDS.has(keyword) && isObject(value)) {
129
+ for (const [key, child] of Object.entries(value)) {
130
+ updateHash(key);
131
+ if (isObject(child)) {
132
+ updateHash(schemaSignature(child));
133
+ weight += weightCache.get(child) ?? 0;
134
+ } else {
135
+ const serialized = JSON.stringify(child);
136
+ updateHash(serialized);
137
+ weight += Buffer.byteLength(serialized);
138
+ }
139
+ }
140
+ } else if (SCHEMA_ARRAY_KEYWORDS.has(keyword) && Array.isArray(value)) {
141
+ for (const child of value) {
142
+ if (isObject(child)) {
143
+ updateHash(schemaSignature(child));
144
+ weight += weightCache.get(child) ?? 0;
145
+ } else {
146
+ const serialized = JSON.stringify(child);
147
+ updateHash(serialized);
148
+ weight += Buffer.byteLength(serialized);
149
+ }
150
+ }
151
+ } else if (SCHEMA_VALUE_KEYWORDS.has(keyword) && isObject(value)) {
152
+ updateHash(schemaSignature(value));
153
+ weight += weightCache.get(value) ?? 0;
154
+ } else if (keyword === "items") {
155
+ updateHash(Array.isArray(value) ? "tuple" : "single");
156
+ const children = Array.isArray(value) ? value : [value];
157
+ for (const child of children) {
158
+ if (isObject(child)) {
159
+ updateHash(schemaSignature(child));
160
+ weight += weightCache.get(child) ?? 0;
161
+ } else {
162
+ const serialized = JSON.stringify(child);
163
+ updateHash(serialized);
164
+ weight += Buffer.byteLength(serialized);
165
+ }
166
+ }
167
+ } else if (keyword === "dependencies" && isObject(value)) {
168
+ for (const [key, child] of Object.entries(value)) {
169
+ updateHash(key);
170
+ if (isObject(child)) {
171
+ updateHash(schemaSignature(child));
172
+ weight += weightCache.get(child) ?? 0;
173
+ } else {
174
+ const serialized = JSON.stringify(child);
175
+ updateHash(serialized);
176
+ weight += Buffer.byteLength(serialized);
177
+ }
178
+ }
179
+ } else {
180
+ const serialized = JSON.stringify(value);
181
+ updateHash(serialized);
182
+ weight += Buffer.byteLength(serialized);
183
+ }
184
+ }
185
+ const signature = hash.digest("hex");
186
+ signatureCache.set(schema, signature);
187
+ weightCache.set(schema, weight);
188
+ return signature;
189
+ };
190
+ const signatureGroups = /* @__PURE__ */ new Map();
191
+ for (const schema of visited) {
192
+ if (schema === root || pointerAddressedNodes.has(schema) || unionAlternatives.has(schema)) continue;
193
+ const signature = schemaSignature(schema);
194
+ const group = signatureGroups.get(signature) ?? [];
195
+ group.push(schema);
196
+ signatureGroups.set(signature, group);
197
+ }
198
+ const sharedNames = /* @__PURE__ */ new Map();
199
+ const sharedDefinitions = /* @__PURE__ */ new Map();
200
+ const reservedNames = new Set(isObject(root.$defs) ? Object.keys(root.$defs) : []);
201
+ let sharedIndex = 0;
202
+ for (const group of signatureGroups.values()) {
203
+ const useCount = group.reduce((sum, schema) => sum + (referenceCounts.get(schema) ?? 0), 0);
204
+ const weight = weightCache.get(group[0]) ?? 0;
205
+ const identityShared = group.some((schema) => (referenceCounts.get(schema) ?? 0) > 1);
206
+ const largeValidationNode = options.maxInlineSchemaBytes !== void 0 && weight >= options.maxInlineSchemaBytes;
207
+ if (!largeValidationNode && (useCount < 2 || !identityShared && weight < 256)) continue;
208
+ let name;
209
+ do
210
+ name = `__adcp_shared_${sharedIndex++}`;
211
+ while (reservedNames.has(name));
212
+ reservedNames.add(name);
213
+ for (const schema of group) sharedNames.set(schema, name);
214
+ sharedDefinitions.set(name, group[0]);
215
+ }
216
+ const encodeSchema = (schema, expanding, ancestors = /* @__PURE__ */ new Set()) => {
217
+ if (!isObject(schema)) return schema;
218
+ const sharedName = sharedNames.get(schema);
219
+ if (sharedName && schema !== expanding) return { $ref: `#/$defs/${sharedName}` };
220
+ if (ancestors.has(schema)) {
221
+ if (!sharedName) throw new Error("Dereferenced schema contains an unaddressable cycle");
222
+ return { $ref: `#/$defs/${sharedName}` };
223
+ }
224
+ const nextAncestors = new Set(ancestors);
225
+ nextAncestors.add(schema);
226
+ const encoded = {};
227
+ for (const [keyword, value] of Object.entries(schema)) {
228
+ if (SCHEMA_MAP_KEYWORDS.has(keyword) && isObject(value)) {
229
+ encoded[keyword] = Object.fromEntries(
230
+ Object.entries(value).map(([key, child]) => [key, encodeSchema(child, void 0, nextAncestors)])
231
+ );
232
+ } else if (SCHEMA_ARRAY_KEYWORDS.has(keyword) && Array.isArray(value)) {
233
+ encoded[keyword] = value.map((child) => encodeSchema(child, void 0, nextAncestors));
234
+ } else if (SCHEMA_VALUE_KEYWORDS.has(keyword)) {
235
+ encoded[keyword] = encodeSchema(value, void 0, nextAncestors);
236
+ } else if (keyword === "items") {
237
+ encoded[keyword] = Array.isArray(value) ? value.map((child) => encodeSchema(child, void 0, nextAncestors)) : encodeSchema(value, void 0, nextAncestors);
238
+ } else if (keyword === "dependencies" && isObject(value)) {
239
+ encoded[keyword] = Object.fromEntries(
240
+ Object.entries(value).map(([key, child]) => [
241
+ key,
242
+ Array.isArray(child) ? cloneData(child) : encodeSchema(child, void 0, nextAncestors)
243
+ ])
244
+ );
245
+ } else {
246
+ encoded[keyword] = cloneData(value);
247
+ }
248
+ }
249
+ return encoded;
250
+ };
251
+ const compacted = encodeSchema(root, root);
252
+ if (compacted[COMPACT_DEFINITIONS_KEY] !== void 0) {
253
+ throw new Error(`Schema already contains reserved property ${COMPACT_DEFINITIONS_KEY}`);
254
+ }
255
+ const defs = isObject(compacted.$defs) ? { ...compacted.$defs } : {};
256
+ for (const [name, schema] of sharedDefinitions) defs[name] = encodeSchema(schema, schema);
257
+ if (Object.keys(defs).length > 0) compacted.$defs = defs;
258
+ if (sharedDefinitions.size > 0) compacted[COMPACT_DEFINITIONS_KEY] = [...sharedDefinitions.keys()];
259
+ return compacted;
260
+ }
261
+ function compactSchemaForValidation(schema) {
262
+ const copied = cloneData(schema);
263
+ const stripIds = (node, root = false) => {
264
+ if (!isObject(node)) return;
265
+ if (!root) delete node.$id;
266
+ forEachChildSchema(node, (child) => stripIds(child));
267
+ };
268
+ stripIds(copied, true);
269
+ return compactBundledSchema(copied, { maxInlineSchemaBytes: 1024 });
270
+ }
271
+ // Annotate the CommonJS export names for ESM import in node:
272
+ 0 && (module.exports = {
273
+ COMPACT_DEFINITIONS_KEY,
274
+ compactBundledSchema,
275
+ compactSchemaForValidation
276
+ });