@adcp/sdk 13.0.0-rc.8 → 13.0.0-rc.9
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/roster-account-store.d.mts +9 -8
- package/dist/lib/adapters/roster-account-store.d.ts +9 -8
- package/dist/lib/adapters/roster-account-store.d.ts.map +1 -1
- package/dist/lib/adapters/roster-account-store.js +2 -1
- package/dist/lib/adapters/roster-account-store.js.map +1 -1
- package/dist/lib/adapters/roster-account-store.mjs +2 -1
- package/dist/lib/adapters/roster-account-store.mjs.map +1 -1
- package/dist/lib/net/address-guards.d.ts.map +1 -1
- package/dist/lib/net/address-guards.js +6 -0
- package/dist/lib/net/address-guards.js.map +1 -1
- package/dist/lib/net/address-guards.mjs +6 -0
- package/dist/lib/net/address-guards.mjs.map +1 -1
- package/dist/lib/net/ssrf-fetch.d.ts.map +1 -1
- package/dist/lib/net/ssrf-fetch.js +66 -53
- package/dist/lib/net/ssrf-fetch.js.map +1 -1
- package/dist/lib/net/ssrf-fetch.mjs +66 -53
- package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/account-mode.d.mts +2 -1
- package/dist/lib/server/account-mode.d.ts +2 -1
- package/dist/lib/server/account-mode.d.ts.map +1 -1
- package/dist/lib/server/account-mode.js +1 -0
- package/dist/lib/server/account-mode.js.map +1 -1
- package/dist/lib/server/account-mode.mjs +1 -0
- package/dist/lib/server/account-mode.mjs.map +1 -1
- package/dist/lib/server/create-adcp-server.d.mts +10 -6
- package/dist/lib/server/create-adcp-server.d.ts +10 -6
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +2 -1
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/create-adcp-server.mjs +2 -1
- package/dist/lib/server/create-adcp-server.mjs.map +1 -1
- package/dist/lib/server/decisioning/account.d.mts +16 -11
- package/dist/lib/server/decisioning/account.d.ts +16 -11
- package/dist/lib/server/decisioning/account.d.ts.map +1 -1
- package/dist/lib/server/decisioning/account.js.map +1 -1
- package/dist/lib/server/decisioning/account.mjs.map +1 -1
- package/dist/lib/server/decisioning/pagination.d.mts +2 -0
- package/dist/lib/server/decisioning/pagination.d.ts +2 -0
- package/dist/lib/server/decisioning/pagination.d.ts.map +1 -1
- package/dist/lib/server/decisioning/pagination.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +20 -14
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +20 -14
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +32 -6
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +32 -6
- package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sales.d.mts +16 -4
- package/dist/lib/server/decisioning/specialisms/sales.d.ts +16 -4
- package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/index.mjs.map +1 -1
- package/dist/lib/server/legacy/v5/index.d.mts +2 -1
- package/dist/lib/server/legacy/v5/index.d.ts +2 -1
- package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
- package/dist/lib/server/legacy/v5/index.js.map +1 -1
- package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
- package/dist/lib/testing/compliance/comply.d.mts +2 -0
- package/dist/lib/testing/compliance/comply.d.ts +2 -0
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +45 -14
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/comply.mjs +45 -14
- package/dist/lib/testing/compliance/comply.mjs.map +1 -1
- package/dist/lib/testing/compliance/index.d.mts +1 -1
- package/dist/lib/testing/compliance/index.d.ts +1 -1
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/index.mjs.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.js +9 -1
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.mjs +9 -1
- package/dist/lib/testing/compliance/storyboard-tracks.mjs.map +1 -1
- package/dist/lib/testing/compliance/types.d.mts +26 -25
- package/dist/lib/testing/compliance/types.d.ts +26 -25
- package/dist/lib/testing/compliance/types.d.ts.map +1 -1
- package/dist/lib/testing/compliance/types.js.map +1 -1
- package/dist/lib/testing/index.d.mts +2 -2
- package/dist/lib/testing/index.d.ts +2 -2
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +16 -0
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/index.mjs +16 -0
- package/dist/lib/testing/index.mjs.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +20 -12
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.mjs +20 -12
- package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
- package/dist/lib/testing/storyboard/creative-assets.d.mts +23 -0
- package/dist/lib/testing/storyboard/creative-assets.d.ts +23 -0
- package/dist/lib/testing/storyboard/creative-assets.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/creative-assets.js +322 -45
- package/dist/lib/testing/storyboard/creative-assets.js.map +1 -1
- package/dist/lib/testing/storyboard/creative-assets.mjs +321 -45
- package/dist/lib/testing/storyboard/creative-assets.mjs.map +1 -1
- package/dist/lib/testing/storyboard/index.d.mts +4 -1
- package/dist/lib/testing/storyboard/index.d.ts +4 -1
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +20 -0
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/index.mjs +19 -0
- package/dist/lib/testing/storyboard/index.mjs.map +1 -1
- package/dist/lib/testing/storyboard/oauth-metadata-graph/grader.d.mts +21 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/grader.d.ts +22 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/grader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/grader.js +668 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/grader.js.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/grader.mjs +638 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/grader.mjs.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/index.d.mts +5 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/index.d.ts +6 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/index.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/index.js +44 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/index.js.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/index.mjs +20 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/index.mjs.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/types.d.mts +38 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/types.d.ts +39 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/types.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/types.js +17 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/types.js.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/types.mjs +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/types.mjs.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/vector-loader.d.mts +32 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/vector-loader.d.ts +33 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/vector-loader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/vector-loader.js +105 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/vector-loader.js.map +1 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/vector-loader.mjs +80 -0
- package/dist/lib/testing/storyboard/oauth-metadata-graph/vector-loader.mjs.map +1 -0
- package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/probes.js +2 -1
- package/dist/lib/testing/storyboard/probes.js.map +1 -1
- package/dist/lib/testing/storyboard/probes.mjs +2 -1
- package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +382 -69
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.mjs +387 -70
- package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
- package/dist/lib/testing/storyboard/seeding.js +3 -1
- package/dist/lib/testing/storyboard/seeding.js.map +1 -1
- package/dist/lib/testing/storyboard/seeding.mjs +3 -1
- package/dist/lib/testing/storyboard/seeding.mjs.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +16 -2
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.mjs +16 -2
- package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
- package/dist/lib/testing/storyboard/trusted-match-context-replay.d.mts +11 -0
- package/dist/lib/testing/storyboard/trusted-match-context-replay.d.ts +12 -0
- package/dist/lib/testing/storyboard/trusted-match-context-replay.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/trusted-match-context-replay.js +340 -0
- package/dist/lib/testing/storyboard/trusted-match-context-replay.js.map +1 -0
- package/dist/lib/testing/storyboard/trusted-match-context-replay.mjs +316 -0
- package/dist/lib/testing/storyboard/trusted-match-context-replay.mjs.map +1 -0
- package/dist/lib/testing/storyboard/types.d.mts +84 -15
- package/dist/lib/testing/storyboard/types.d.ts +84 -15
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js +2 -0
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/storyboard/types.mjs +2 -0
- package/dist/lib/testing/storyboard/types.mjs.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.mts +3 -0
- package/dist/lib/testing/storyboard/validations.d.ts +3 -0
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +64 -24
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/storyboard/validations.mjs +64 -24
- package/dist/lib/testing/storyboard/validations.mjs.map +1 -1
- package/dist/lib/types/server-payload-aliases.d.mts +8 -2
- package/dist/lib/types/server-payload-aliases.d.ts +8 -2
- package/dist/lib/types/server-payload-aliases.d.ts.map +1 -1
- package/dist/lib/types/server-payload-aliases.js.map +1 -1
- package/dist/lib/upstream-recorder/recorder.d.mts +7 -18
- package/dist/lib/upstream-recorder/recorder.d.ts +7 -18
- package/dist/lib/upstream-recorder/recorder.d.ts.map +1 -1
- package/dist/lib/upstream-recorder/recorder.js +17 -10
- package/dist/lib/upstream-recorder/recorder.js.map +1 -1
- package/dist/lib/upstream-recorder/recorder.mjs +12 -5
- package/dist/lib/upstream-recorder/recorder.mjs.map +1 -1
- package/dist/lib/utils/redact-secrets.d.ts.map +1 -1
- package/dist/lib/utils/redact-secrets.js +7 -1
- package/dist/lib/utils/redact-secrets.js.map +1 -1
- package/dist/lib/utils/redact-secrets.mjs +7 -1
- package/dist/lib/utils/redact-secrets.mjs.map +1 -1
- 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.js.map +1 -1
- package/dist/lib/version.mjs +3 -3
- package/dist/lib/version.mjs.map +1 -1
- package/docs/guides/BUILD-AN-AGENT.md +4 -2
- package/docs/llms.txt +1 -1
- package/package.json +2 -2
|
@@ -17,15 +17,41 @@ function formatIdMatches(candidate, requested) {
|
|
|
17
17
|
return requestedAgent === void 0 || candidateAgent === requestedAgent;
|
|
18
18
|
}
|
|
19
19
|
function resolveFormat(value, context) {
|
|
20
|
-
if (!isObject(value))
|
|
20
|
+
if (!isObject(value)) {
|
|
21
|
+
return {
|
|
22
|
+
ok: false,
|
|
23
|
+
reason: "malformed_directive",
|
|
24
|
+
constraint: "directive value must be a format object or FormatId"
|
|
25
|
+
};
|
|
26
|
+
}
|
|
21
27
|
if (Array.isArray(value.slots) || Array.isArray(value.assets) || Array.isArray(value.assets_required)) {
|
|
22
|
-
return value;
|
|
28
|
+
return { ok: true, format: value };
|
|
29
|
+
}
|
|
30
|
+
if (typeof value.id !== "string") {
|
|
31
|
+
return { ok: false, reason: "malformed_directive", constraint: "format reference must contain a string id" };
|
|
23
32
|
}
|
|
24
|
-
if (typeof value.id !== "string") return void 0;
|
|
25
33
|
const formats = Array.isArray(context.formats) ? context.formats : [];
|
|
26
|
-
|
|
34
|
+
const format = formats.find(
|
|
27
35
|
(candidate) => isObject(candidate) && formatIdMatches(candidate.format_id, value)
|
|
28
36
|
);
|
|
37
|
+
if (!format) {
|
|
38
|
+
const agent = typeof value.agent_url === "string" ? ` from ${value.agent_url}` : "";
|
|
39
|
+
return {
|
|
40
|
+
ok: false,
|
|
41
|
+
reason: "format_not_found",
|
|
42
|
+
constraint: `format "${value.id}"${agent} is absent from storyboard context.formats`
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const catalogFormatId = isObject(format.format_id) ? format.format_id : {};
|
|
46
|
+
return {
|
|
47
|
+
ok: true,
|
|
48
|
+
format: {
|
|
49
|
+
...format,
|
|
50
|
+
...asNumber(value.width) !== void 0 ? { width: value.width } : {},
|
|
51
|
+
...asNumber(value.height) !== void 0 ? { height: value.height } : {},
|
|
52
|
+
format_id: { ...catalogFormatId, ...value }
|
|
53
|
+
}
|
|
54
|
+
};
|
|
29
55
|
}
|
|
30
56
|
function dimensionsFromId(format) {
|
|
31
57
|
const formatId = isObject(format.format_id) ? format.format_id.id : void 0;
|
|
@@ -33,7 +59,11 @@ function dimensionsFromId(format) {
|
|
|
33
59
|
return match ? { width: Number(match[1]), height: Number(match[2]) } : {};
|
|
34
60
|
}
|
|
35
61
|
function formatDimensions(format) {
|
|
36
|
-
const
|
|
62
|
+
const nestedFormatId = isObject(format.format_id) ? format.format_id : {};
|
|
63
|
+
const direct = {
|
|
64
|
+
width: asNumber(format.width) ?? asNumber(nestedFormatId.width),
|
|
65
|
+
height: asNumber(format.height) ?? asNumber(nestedFormatId.height)
|
|
66
|
+
};
|
|
37
67
|
if (direct.width !== void 0 || direct.height !== void 0) return direct;
|
|
38
68
|
const renders = Array.isArray(format.renders) ? format.renders : [];
|
|
39
69
|
for (const render of renders) {
|
|
@@ -56,79 +86,324 @@ function slotDimensions(slot, fallback) {
|
|
|
56
86
|
function requiredSlots(format) {
|
|
57
87
|
const canonicalSlots = Array.isArray(format.slots) ? format.slots : void 0;
|
|
58
88
|
const legacySlots = Array.isArray(format.assets) ? format.assets : Array.isArray(format.assets_required) ? format.assets_required : void 0;
|
|
89
|
+
const usesAssetsRequired = canonicalSlots === void 0 && !Array.isArray(format.assets) && legacySlots !== void 0;
|
|
59
90
|
const slots = canonicalSlots ?? legacySlots ?? [];
|
|
60
91
|
const fallback = formatDimensions(format);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
92
|
+
const container = canonicalSlots !== void 0 ? "slots" : usesAssetsRequired ? "assets_required" : "assets";
|
|
93
|
+
const required = [];
|
|
94
|
+
for (let index = 0; index < slots.length; index += 1) {
|
|
95
|
+
const slotValue = slots[index];
|
|
96
|
+
if (!isObject(slotValue) || !usesAssetsRequired && slotValue.required !== true) continue;
|
|
97
|
+
const isRepeatableGroup = slotValue.item_type === "repeatable_group";
|
|
98
|
+
const id = canonicalSlots !== void 0 || isRepeatableGroup ? slotValue.asset_group_id : slotValue.asset_id;
|
|
99
|
+
const assetType = typeof slotValue.asset_type === "string" ? slotValue.asset_type : isRepeatableGroup ? "repeatable_group" : void 0;
|
|
100
|
+
const idField = canonicalSlots !== void 0 || isRepeatableGroup ? "asset_group_id" : "asset_id";
|
|
101
|
+
if (typeof id !== "string") {
|
|
102
|
+
return { ok: false, constraint: `required ${container}[${index}].${idField} must be a string` };
|
|
103
|
+
}
|
|
104
|
+
if (assetType === void 0) {
|
|
105
|
+
return { ok: false, constraint: `required ${container}[${index}].asset_type must be a string` };
|
|
106
|
+
}
|
|
107
|
+
const requirements = isObject(slotValue.requirements) ? slotValue.requirements : {};
|
|
108
|
+
const dimensions = slotDimensions(slotValue, fallback);
|
|
109
|
+
required.push({ id, assetType, requirements, ...dimensions });
|
|
110
|
+
}
|
|
111
|
+
return { ok: true, slots: required };
|
|
112
|
+
}
|
|
113
|
+
function imageConstraint(slot) {
|
|
114
|
+
if (slot.width !== void 0 && slot.height !== void 0) {
|
|
115
|
+
return `requires an exact ${slot.width}x${slot.height} image fixture`;
|
|
116
|
+
}
|
|
117
|
+
if (slot.width !== void 0) return `requires an image fixture with exact width ${slot.width}`;
|
|
118
|
+
if (slot.height !== void 0) return `requires an image fixture with exact height ${slot.height}`;
|
|
119
|
+
return "requires an image fixture with a URL";
|
|
120
|
+
}
|
|
121
|
+
function imageFixtureMismatch(candidate, slot) {
|
|
122
|
+
const requirements = slot.requirements;
|
|
123
|
+
const supported = /* @__PURE__ */ new Set([
|
|
124
|
+
"width",
|
|
125
|
+
"height",
|
|
126
|
+
"dimensions",
|
|
127
|
+
"min_width",
|
|
128
|
+
"max_width",
|
|
129
|
+
"min_height",
|
|
130
|
+
"max_height",
|
|
131
|
+
"aspect_ratio",
|
|
132
|
+
"formats",
|
|
133
|
+
"pixel_ratios",
|
|
134
|
+
"parameters_from_format_id",
|
|
135
|
+
"unit"
|
|
136
|
+
]);
|
|
137
|
+
const unsupported = Object.keys(requirements).find((key) => !supported.has(key));
|
|
138
|
+
if (unsupported) return `cannot verify image requirement "${unsupported}" from fixture metadata`;
|
|
139
|
+
const unit = typeof requirements.unit === "string" ? requirements.unit : "px";
|
|
140
|
+
if (unit !== "px" && unit !== "pixel" && unit !== "pixels") {
|
|
141
|
+
return `requires image dimensions in unsupported unit "${unit}"`;
|
|
142
|
+
}
|
|
143
|
+
const width = asNumber(candidate.width);
|
|
144
|
+
const height = asNumber(candidate.height);
|
|
145
|
+
const minWidth = asNumber(requirements.min_width);
|
|
146
|
+
const maxWidth = asNumber(requirements.max_width);
|
|
147
|
+
const minHeight = asNumber(requirements.min_height);
|
|
148
|
+
const maxHeight = asNumber(requirements.max_height);
|
|
149
|
+
if (minWidth !== void 0 && (width === void 0 || width < minWidth)) return `requires minimum width ${minWidth}`;
|
|
150
|
+
if (maxWidth !== void 0 && (width === void 0 || width > maxWidth)) return `requires maximum width ${maxWidth}`;
|
|
151
|
+
if (minHeight !== void 0 && (height === void 0 || height < minHeight)) {
|
|
152
|
+
return `requires minimum height ${minHeight}`;
|
|
153
|
+
}
|
|
154
|
+
if (maxHeight !== void 0 && (height === void 0 || height > maxHeight)) {
|
|
155
|
+
return `requires maximum height ${maxHeight}`;
|
|
156
|
+
}
|
|
157
|
+
if (typeof requirements.aspect_ratio === "string") {
|
|
158
|
+
const match = /^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)$/.exec(requirements.aspect_ratio);
|
|
159
|
+
if (!match || width === void 0 || height === void 0) {
|
|
160
|
+
return `cannot verify aspect ratio "${requirements.aspect_ratio}"`;
|
|
161
|
+
}
|
|
162
|
+
const expected = Number(match[1]) / Number(match[2]);
|
|
163
|
+
if (Math.abs(width / height - expected) > 1e-3) return `requires aspect ratio ${requirements.aspect_ratio}`;
|
|
164
|
+
}
|
|
165
|
+
if (Array.isArray(requirements.formats)) {
|
|
166
|
+
const mimeType = typeof candidate.mime_type === "string" ? candidate.mime_type.toLowerCase() : "";
|
|
167
|
+
const extension = mimeType.split("/")[1]?.replace("jpeg", "jpg");
|
|
168
|
+
const allowed = requirements.formats.filter((item) => typeof item === "string").map((item) => item.toLowerCase().replace("jpeg", "jpg"));
|
|
169
|
+
if (!extension || !allowed.includes(extension)) return `requires image format in [${allowed.join(", ")}]`;
|
|
170
|
+
}
|
|
171
|
+
if (Array.isArray(requirements.pixel_ratios)) {
|
|
172
|
+
const ratio = asNumber(candidate.pixel_ratio) ?? 1;
|
|
173
|
+
const allowed = requirements.pixel_ratios.filter((item) => asNumber(item) !== void 0);
|
|
174
|
+
if (!allowed.includes(ratio)) return `requires pixel ratio in [${allowed.join(", ")}]`;
|
|
175
|
+
}
|
|
176
|
+
return void 0;
|
|
67
177
|
}
|
|
68
178
|
function buildImage(slot, assets) {
|
|
69
179
|
const images = Array.isArray(assets.images) ? assets.images.filter(isObject) : [];
|
|
180
|
+
let mismatch;
|
|
70
181
|
const image = images.find((candidate) => {
|
|
71
182
|
const widthMatches = slot.width === void 0 || candidate.width === slot.width;
|
|
72
183
|
const heightMatches = slot.height === void 0 || candidate.height === slot.height;
|
|
73
|
-
|
|
184
|
+
if (!widthMatches || !heightMatches) return false;
|
|
185
|
+
const candidateMismatch = imageFixtureMismatch(candidate, slot);
|
|
186
|
+
if (candidateMismatch) {
|
|
187
|
+
mismatch ??= candidateMismatch;
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
74
191
|
});
|
|
75
|
-
if (!image
|
|
192
|
+
if (!image) {
|
|
193
|
+
return { ok: false, constraint: mismatch ? `${imageConstraint(slot)}; ${mismatch}` : imageConstraint(slot) };
|
|
194
|
+
}
|
|
195
|
+
if (typeof image.url !== "string") {
|
|
196
|
+
return { ok: false, constraint: `${imageConstraint(slot)}, but the matching fixture has no URL` };
|
|
197
|
+
}
|
|
76
198
|
return {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
199
|
+
ok: true,
|
|
200
|
+
asset: {
|
|
201
|
+
asset_type: "image",
|
|
202
|
+
url: image.url,
|
|
203
|
+
...asNumber(image.width) !== void 0 ? { width: image.width } : {},
|
|
204
|
+
...asNumber(image.height) !== void 0 ? { height: image.height } : {},
|
|
205
|
+
...typeof image.mime_type === "string" ? { mime_type: image.mime_type } : {}
|
|
206
|
+
}
|
|
82
207
|
};
|
|
83
208
|
}
|
|
84
|
-
function
|
|
85
|
-
|
|
209
|
+
function textFixtureMismatch(content, requirements) {
|
|
210
|
+
const supported = /* @__PURE__ */ new Set([
|
|
211
|
+
"min_length",
|
|
212
|
+
"max_length",
|
|
213
|
+
"min_lines",
|
|
214
|
+
"max_lines",
|
|
215
|
+
"prohibited_terms",
|
|
216
|
+
"allowed_values"
|
|
217
|
+
]);
|
|
218
|
+
const unsupported = Object.keys(requirements).find((key) => !supported.has(key));
|
|
219
|
+
if (unsupported) return `cannot verify text requirement "${unsupported}"`;
|
|
220
|
+
const minLength = asNumber(requirements.min_length);
|
|
221
|
+
const maxLength = asNumber(requirements.max_length);
|
|
222
|
+
if (minLength !== void 0 && content.length < minLength) return `requires minimum length ${minLength}`;
|
|
223
|
+
if (maxLength !== void 0 && content.length > maxLength) return `requires maximum length ${maxLength}`;
|
|
224
|
+
const lines = content.split(/\r?\n/).length;
|
|
225
|
+
const minLines = asNumber(requirements.min_lines);
|
|
226
|
+
const maxLines = asNumber(requirements.max_lines);
|
|
227
|
+
if (minLines !== void 0 && lines < minLines) return `requires minimum line count ${minLines}`;
|
|
228
|
+
if (maxLines !== void 0 && lines > maxLines) return `requires maximum line count ${maxLines}`;
|
|
229
|
+
if (Array.isArray(requirements.prohibited_terms)) {
|
|
230
|
+
const prohibited = requirements.prohibited_terms.find(
|
|
231
|
+
(term) => typeof term === "string" && content.toLowerCase().includes(term.toLowerCase())
|
|
232
|
+
);
|
|
233
|
+
if (prohibited) return `prohibits term "${prohibited}"`;
|
|
234
|
+
}
|
|
235
|
+
if (Array.isArray(requirements.allowed_values) && !requirements.allowed_values.some((value) => typeof value === "string" && value === content)) {
|
|
236
|
+
return "requires one of the declared allowed_values";
|
|
237
|
+
}
|
|
238
|
+
return void 0;
|
|
86
239
|
}
|
|
87
240
|
function buildText(slot, assets) {
|
|
88
241
|
const text = isObject(assets.text) ? assets.text : {};
|
|
89
242
|
const id = slot.id.toLowerCase();
|
|
90
|
-
const
|
|
91
|
-
|
|
243
|
+
const fixtureCategory = {
|
|
244
|
+
headline: "headlines",
|
|
245
|
+
title: "headlines",
|
|
246
|
+
description: "descriptions",
|
|
247
|
+
body: "descriptions",
|
|
248
|
+
body_text: "descriptions",
|
|
249
|
+
primary_text: "descriptions",
|
|
250
|
+
cta: "cta",
|
|
251
|
+
cta_text: "cta",
|
|
252
|
+
call_to_action: "cta"
|
|
253
|
+
}[id];
|
|
254
|
+
if (fixtureCategory === void 0) {
|
|
255
|
+
return {
|
|
256
|
+
ok: false,
|
|
257
|
+
constraint: "slot id has no exact runner mapping to a headlines, descriptions, or CTA fixture category"
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
const candidates = Array.isArray(text[fixtureCategory]) ? text[fixtureCategory].filter((item) => typeof item === "string") : [];
|
|
261
|
+
let mismatch;
|
|
262
|
+
const content = candidates.find((candidate) => {
|
|
263
|
+
const candidateMismatch = textFixtureMismatch(candidate, slot.requirements);
|
|
264
|
+
if (candidateMismatch) {
|
|
265
|
+
mismatch ??= candidateMismatch;
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
return true;
|
|
269
|
+
});
|
|
270
|
+
return content === void 0 ? {
|
|
271
|
+
ok: false,
|
|
272
|
+
constraint: mismatch ?? `requires a ${fixtureCategory} text fixture`
|
|
273
|
+
} : { ok: true, asset: { asset_type: "text", content } };
|
|
274
|
+
}
|
|
275
|
+
function containsUrlMacro(value) {
|
|
276
|
+
let inMacro = false;
|
|
277
|
+
let hasContent = false;
|
|
278
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
279
|
+
if (!inMacro) {
|
|
280
|
+
if (value[index] === "$" && value[index + 1] === "{") {
|
|
281
|
+
inMacro = true;
|
|
282
|
+
hasContent = false;
|
|
283
|
+
index += 1;
|
|
284
|
+
}
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
if (value[index] === "}") {
|
|
288
|
+
if (hasContent) return true;
|
|
289
|
+
inMacro = false;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
hasContent = true;
|
|
293
|
+
}
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
function buildUrl(slot, assets) {
|
|
297
|
+
if (typeof assets.click_url !== "string") return { ok: false, constraint: "requires a click_url fixture" };
|
|
298
|
+
const url = assets.click_url;
|
|
299
|
+
const supported = /* @__PURE__ */ new Set(["role", "protocols", "allowed_domains", "max_length", "macro_support"]);
|
|
300
|
+
const unsupported = Object.keys(slot.requirements).find((key) => !supported.has(key));
|
|
301
|
+
if (unsupported) return { ok: false, constraint: `cannot verify URL requirement "${unsupported}"` };
|
|
302
|
+
const maxLength = asNumber(slot.requirements.max_length);
|
|
303
|
+
if (maxLength !== void 0 && url.length > maxLength) {
|
|
304
|
+
return { ok: false, constraint: `requires URL maximum length ${maxLength}` };
|
|
305
|
+
}
|
|
306
|
+
let parsed;
|
|
307
|
+
try {
|
|
308
|
+
parsed = new URL(url);
|
|
309
|
+
} catch {
|
|
310
|
+
return { ok: false, constraint: "click_url fixture is not an absolute URL" };
|
|
311
|
+
}
|
|
312
|
+
if (Array.isArray(slot.requirements.protocols) && !slot.requirements.protocols.some((protocol) => protocol === parsed.protocol.replace(/:$/, ""))) {
|
|
313
|
+
return { ok: false, constraint: "click_url fixture uses a disallowed protocol" };
|
|
314
|
+
}
|
|
315
|
+
if (Array.isArray(slot.requirements.allowed_domains) && !slot.requirements.allowed_domains.some((domain) => domain === parsed.hostname)) {
|
|
316
|
+
return { ok: false, constraint: "click_url fixture uses a disallowed domain" };
|
|
317
|
+
}
|
|
318
|
+
if (slot.requirements.macro_support === true && !containsUrlMacro(url)) {
|
|
319
|
+
return { ok: false, constraint: "requires a URL fixture with macro support" };
|
|
320
|
+
}
|
|
321
|
+
return { ok: true, asset: { asset_type: "url", url } };
|
|
92
322
|
}
|
|
93
323
|
function buildAsset(slot, testKit) {
|
|
94
|
-
if (!isObject(testKit) || !isObject(testKit.assets))
|
|
324
|
+
if (!isObject(testKit) || !isObject(testKit.assets)) {
|
|
325
|
+
return { ok: false, constraint: "selected test kit does not declare asset fixtures" };
|
|
326
|
+
}
|
|
95
327
|
const assets = testKit.assets;
|
|
96
328
|
if (slot.assetType === "image") return buildImage(slot, assets);
|
|
97
|
-
if (slot.assetType === "url"
|
|
98
|
-
return { asset_type: "url", url: assets.click_url };
|
|
99
|
-
}
|
|
329
|
+
if (slot.assetType === "url") return buildUrl(slot, assets);
|
|
100
330
|
if (slot.assetType === "text") return buildText(slot, assets);
|
|
101
|
-
return
|
|
331
|
+
return { ok: false, constraint: `asset type "${slot.assetType}" is not supported by the selected test kit` };
|
|
102
332
|
}
|
|
103
333
|
function buildAssets(value, context, testKit) {
|
|
104
|
-
const
|
|
105
|
-
if (!
|
|
106
|
-
|
|
107
|
-
|
|
334
|
+
const resolved = resolveFormat(value, context);
|
|
335
|
+
if (!resolved.ok) {
|
|
336
|
+
return { ok: false, failure: { reason: resolved.reason, constraint: resolved.constraint } };
|
|
337
|
+
}
|
|
338
|
+
const required = requiredSlots(resolved.format);
|
|
339
|
+
if (!required.ok) {
|
|
340
|
+
return { ok: false, failure: { reason: "malformed_directive", constraint: required.constraint } };
|
|
341
|
+
}
|
|
108
342
|
const built = {};
|
|
109
|
-
for (const slot of slots) {
|
|
110
|
-
const
|
|
111
|
-
if (!
|
|
112
|
-
|
|
343
|
+
for (const slot of required.slots) {
|
|
344
|
+
const result = buildAsset(slot, testKit);
|
|
345
|
+
if (!result.ok) {
|
|
346
|
+
return {
|
|
347
|
+
ok: false,
|
|
348
|
+
failure: {
|
|
349
|
+
reason: "fixture_unavailable",
|
|
350
|
+
slotId: slot.id,
|
|
351
|
+
assetType: slot.assetType,
|
|
352
|
+
constraint: result.constraint
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
built[slot.id] = result.asset;
|
|
113
357
|
}
|
|
114
|
-
return built;
|
|
358
|
+
return { ok: true, assets: built };
|
|
115
359
|
}
|
|
116
|
-
function
|
|
360
|
+
function expandWithDiagnostics(value, context, testKit, path) {
|
|
117
361
|
if (Array.isArray(value)) {
|
|
118
|
-
|
|
362
|
+
const expanded2 = Array.from(value);
|
|
363
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
364
|
+
const result = expandWithDiagnostics(value[index], context, testKit, `${path}[${index}]`);
|
|
365
|
+
expanded2[index] = result.value;
|
|
366
|
+
if (!result.ok) return { ...result, value: expanded2 };
|
|
367
|
+
}
|
|
368
|
+
return { ok: true, value: expanded2 };
|
|
119
369
|
}
|
|
120
|
-
if (!isObject(value)) return value;
|
|
370
|
+
if (!isObject(value)) return { ok: true, value };
|
|
121
371
|
if (Object.prototype.hasOwnProperty.call(value, BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)) {
|
|
122
372
|
const built = buildAssets(value[BUILD_ASSETS_FROM_FORMAT_DIRECTIVE], context, testKit);
|
|
123
|
-
if (!built)
|
|
373
|
+
if (!built.ok) {
|
|
374
|
+
return {
|
|
375
|
+
ok: false,
|
|
376
|
+
value,
|
|
377
|
+
failure: {
|
|
378
|
+
...built.failure,
|
|
379
|
+
path: `${path}.${BUILD_ASSETS_FROM_FORMAT_DIRECTIVE}`
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
}
|
|
124
383
|
const siblings = Object.fromEntries(
|
|
125
|
-
Object.entries(value).filter(([key]) => key !== BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)
|
|
384
|
+
Object.entries(value).filter(([key]) => key !== BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)
|
|
126
385
|
);
|
|
127
|
-
|
|
386
|
+
for (const [key, item] of Object.entries(value)) {
|
|
387
|
+
if (key === BUILD_ASSETS_FROM_FORMAT_DIRECTIVE) continue;
|
|
388
|
+
const result = expandWithDiagnostics(item, context, testKit, `${path}.${key}`);
|
|
389
|
+
siblings[key] = result.value;
|
|
390
|
+
if (!result.ok) return { ...result, value: { ...siblings, ...built.assets } };
|
|
391
|
+
}
|
|
392
|
+
return { ok: true, value: { ...siblings, ...built.assets } };
|
|
128
393
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
394
|
+
const expanded = { ...value };
|
|
395
|
+
for (const [key, item] of Object.entries(value)) {
|
|
396
|
+
const result = expandWithDiagnostics(item, context, testKit, `${path}.${key}`);
|
|
397
|
+
expanded[key] = result.value;
|
|
398
|
+
if (!result.ok) return { ...result, value: expanded };
|
|
399
|
+
}
|
|
400
|
+
return { ok: true, value: expanded };
|
|
401
|
+
}
|
|
402
|
+
function expandCreativeAssetDirectivesWithDiagnostics(value, context, testKit) {
|
|
403
|
+
return expandWithDiagnostics(value, context, testKit, "$");
|
|
404
|
+
}
|
|
405
|
+
function expandCreativeAssetDirectives(value, context, testKit) {
|
|
406
|
+
return expandCreativeAssetDirectivesWithDiagnostics(value, context, testKit).value;
|
|
132
407
|
}
|
|
133
408
|
function findUnresolvedCreativeAssetDirectives(value) {
|
|
134
409
|
const paths = [];
|
|
@@ -149,6 +424,7 @@ function findUnresolvedCreativeAssetDirectives(value) {
|
|
|
149
424
|
export {
|
|
150
425
|
BUILD_ASSETS_FROM_FORMAT_DIRECTIVE,
|
|
151
426
|
expandCreativeAssetDirectives,
|
|
427
|
+
expandCreativeAssetDirectivesWithDiagnostics,
|
|
152
428
|
findUnresolvedCreativeAssetDirectives
|
|
153
429
|
};
|
|
154
430
|
//# sourceMappingURL=creative-assets.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/testing/storyboard/creative-assets.ts"],"sourcesContent":["import type { StoryboardContext } from './types';\n\nexport const BUILD_ASSETS_FROM_FORMAT_DIRECTIVE = '$build_assets_from_format';\n\ntype JsonObject = Record<string, unknown>;\n\ninterface Dimensions {\n width?: number;\n height?: number;\n}\n\ninterface RequiredSlot extends Dimensions {\n id: string;\n assetType: string;\n}\n\nfunction isObject(value: unknown): value is JsonObject {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeAgentUrl(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n return value.replace(/\\/$/, '');\n}\n\nfunction formatIdMatches(candidate: unknown, requested: JsonObject): boolean {\n if (!isObject(candidate)) return false;\n if (candidate.id !== requested.id) return false;\n const requestedAgent = normalizeAgentUrl(requested.agent_url);\n const candidateAgent = normalizeAgentUrl(candidate.agent_url);\n return requestedAgent === undefined || candidateAgent === requestedAgent;\n}\n\nfunction resolveFormat(value: unknown, context: StoryboardContext): JsonObject | undefined {\n if (!isObject(value)) return undefined;\n if (Array.isArray(value.slots) || Array.isArray(value.assets) || Array.isArray(value.assets_required)) {\n return value;\n }\n\n if (typeof value.id !== 'string') return undefined;\n const formats = Array.isArray(context.formats) ? context.formats : [];\n return formats.find(\n (candidate): candidate is JsonObject => isObject(candidate) && formatIdMatches(candidate.format_id, value)\n );\n}\n\nfunction dimensionsFromId(format: JsonObject): Dimensions {\n const formatId = isObject(format.format_id) ? format.format_id.id : undefined;\n const match = typeof formatId === 'string' ? formatId.match(/(?:^|_)(\\d{2,4})x(\\d{2,4})(?:_|$)/i) : null;\n return match ? { width: Number(match[1]), height: Number(match[2]) } : {};\n}\n\nfunction formatDimensions(format: JsonObject): Dimensions {\n const direct = { width: asNumber(format.width), height: asNumber(format.height) };\n if (direct.width !== undefined || direct.height !== undefined) return direct;\n\n const renders = Array.isArray(format.renders) ? format.renders : [];\n for (const render of renders) {\n if (!isObject(render)) continue;\n const dimensions = isObject(render.dimensions) ? render.dimensions : render;\n const width = asNumber(dimensions.width);\n const height = asNumber(dimensions.height);\n if (width !== undefined || height !== undefined) return { width, height };\n }\n\n return dimensionsFromId(format);\n}\n\nfunction slotDimensions(slot: JsonObject, fallback: Dimensions): Dimensions {\n const requirements = isObject(slot.requirements) ? slot.requirements : {};\n const nested = isObject(requirements.dimensions) ? requirements.dimensions : requirements;\n return {\n width: asNumber(slot.width) ?? asNumber(nested.width) ?? fallback.width,\n height: asNumber(slot.height) ?? asNumber(nested.height) ?? fallback.height,\n };\n}\n\nfunction requiredSlots(format: JsonObject): RequiredSlot[] {\n const canonicalSlots = Array.isArray(format.slots) ? format.slots : undefined;\n const legacySlots = Array.isArray(format.assets)\n ? format.assets\n : Array.isArray(format.assets_required)\n ? format.assets_required\n : undefined;\n const slots = canonicalSlots ?? legacySlots ?? [];\n const fallback = formatDimensions(format);\n\n return slots.flatMap(slotValue => {\n if (!isObject(slotValue) || slotValue.required !== true) return [];\n const id = canonicalSlots ? slotValue.asset_group_id : slotValue.asset_id;\n if (typeof id !== 'string' || typeof slotValue.asset_type !== 'string') return [];\n return [{ id, assetType: slotValue.asset_type, ...slotDimensions(slotValue, fallback) }];\n });\n}\n\nfunction buildImage(slot: RequiredSlot, assets: JsonObject): JsonObject | undefined {\n const images = Array.isArray(assets.images) ? assets.images.filter(isObject) : [];\n const image = images.find(candidate => {\n const widthMatches = slot.width === undefined || candidate.width === slot.width;\n const heightMatches = slot.height === undefined || candidate.height === slot.height;\n return widthMatches && heightMatches;\n });\n if (!image || typeof image.url !== 'string') return undefined;\n return {\n asset_type: 'image',\n url: image.url,\n ...(asNumber(image.width) !== undefined ? { width: image.width } : {}),\n ...(asNumber(image.height) !== undefined ? { height: image.height } : {}),\n ...(typeof image.mime_type === 'string' ? { mime_type: image.mime_type } : {}),\n };\n}\n\nfunction firstString(value: unknown): string | undefined {\n return Array.isArray(value) ? value.find((item): item is string => typeof item === 'string') : undefined;\n}\n\nfunction buildText(slot: RequiredSlot, assets: JsonObject): JsonObject | undefined {\n const text = isObject(assets.text) ? assets.text : {};\n const id = slot.id.toLowerCase();\n const content = id.includes('headline')\n ? firstString(text.headlines)\n : id.includes('description') || id.includes('body')\n ? firstString(text.descriptions)\n : id.includes('cta') || id.includes('call_to_action')\n ? firstString(text.cta)\n : (firstString(text.headlines) ?? firstString(text.descriptions) ?? firstString(text.cta));\n return content === undefined ? undefined : { asset_type: 'text', content };\n}\n\nfunction buildAsset(slot: RequiredSlot, testKit: unknown): JsonObject | undefined {\n if (!isObject(testKit) || !isObject(testKit.assets)) return undefined;\n const assets = testKit.assets;\n if (slot.assetType === 'image') return buildImage(slot, assets);\n if (slot.assetType === 'url' && typeof assets.click_url === 'string') {\n return { asset_type: 'url', url: assets.click_url };\n }\n if (slot.assetType === 'text') return buildText(slot, assets);\n return undefined;\n}\n\nfunction buildAssets(value: unknown, context: StoryboardContext, testKit: unknown): JsonObject | undefined {\n const format = resolveFormat(value, context);\n if (!format) return undefined;\n const slots = requiredSlots(format);\n if (slots.length === 0) return undefined;\n\n const built: JsonObject = {};\n for (const slot of slots) {\n const asset = buildAsset(slot, testKit);\n if (!asset) return undefined;\n built[slot.id] = asset;\n }\n return built;\n}\n\n/** Expand reserved storyboard creative-asset directives without mutating the fixture. */\nexport function expandCreativeAssetDirectives(value: unknown, context: StoryboardContext, testKit: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(item => expandCreativeAssetDirectives(item, context, testKit));\n }\n if (!isObject(value)) return value;\n\n if (Object.prototype.hasOwnProperty.call(value, BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)) {\n const built = buildAssets(value[BUILD_ASSETS_FROM_FORMAT_DIRECTIVE], context, testKit);\n if (!built) return value;\n const siblings = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)\n .map(([key, item]) => [key, expandCreativeAssetDirectives(item, context, testKit)])\n );\n return { ...siblings, ...built };\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, expandCreativeAssetDirectives(item, context, testKit)])\n );\n}\n\nexport function findUnresolvedCreativeAssetDirectives(value: unknown): string[] {\n const paths: string[] = [];\n const walk = (item: unknown, path: string) => {\n if (Array.isArray(item)) {\n item.forEach((entry, index) => walk(entry, `${path}[${index}]`));\n return;\n }\n if (!isObject(item)) return;\n if (Object.prototype.hasOwnProperty.call(item, BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)) {\n paths.push(`${path}.${BUILD_ASSETS_FROM_FORMAT_DIRECTIVE}`);\n }\n Object.entries(item).forEach(([key, entry]) => walk(entry, path ? `${path}.${key}` : key));\n };\n walk(value, '$');\n return paths;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/testing/storyboard/creative-assets.ts"],"sourcesContent":["import type { StoryboardContext } from './types';\n\nexport const BUILD_ASSETS_FROM_FORMAT_DIRECTIVE = '$build_assets_from_format';\n\ntype JsonObject = Record<string, unknown>;\n\ninterface Dimensions {\n width?: number;\n height?: number;\n}\n\ninterface RequiredSlot extends Dimensions {\n id: string;\n assetType: string;\n requirements: JsonObject;\n}\n\ntype AssetsBuildFailure =\n | {\n reason: 'format_not_found' | 'malformed_directive';\n constraint: string;\n }\n | {\n reason: 'fixture_unavailable';\n slotId: string;\n assetType: string;\n constraint: string;\n };\n\nexport type CreativeAssetExpansionFailure = AssetsBuildFailure & { path: string };\n\nexport type CreativeAssetExpansionResult =\n | { ok: true; value: unknown }\n | { ok: false; value: unknown; failure: CreativeAssetExpansionFailure };\n\ntype AssetBuildResult = { ok: true; asset: JsonObject } | { ok: false; constraint: string };\n\ntype AssetsBuildResult = { ok: true; assets: JsonObject } | { ok: false; failure: AssetsBuildFailure };\n\ntype RequiredSlotsResult = { ok: true; slots: RequiredSlot[] } | { ok: false; constraint: string };\n\nfunction isObject(value: unknown): value is JsonObject {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeAgentUrl(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n return value.replace(/\\/$/, '');\n}\n\nfunction formatIdMatches(candidate: unknown, requested: JsonObject): boolean {\n if (!isObject(candidate)) return false;\n if (candidate.id !== requested.id) return false;\n const requestedAgent = normalizeAgentUrl(requested.agent_url);\n const candidateAgent = normalizeAgentUrl(candidate.agent_url);\n return requestedAgent === undefined || candidateAgent === requestedAgent;\n}\n\nfunction resolveFormat(\n value: unknown,\n context: StoryboardContext\n):\n | { ok: true; format: JsonObject }\n | { ok: false; reason: 'format_not_found' | 'malformed_directive'; constraint: string } {\n if (!isObject(value)) {\n return {\n ok: false,\n reason: 'malformed_directive',\n constraint: 'directive value must be a format object or FormatId',\n };\n }\n if (Array.isArray(value.slots) || Array.isArray(value.assets) || Array.isArray(value.assets_required)) {\n return { ok: true, format: value };\n }\n\n if (typeof value.id !== 'string') {\n return { ok: false, reason: 'malformed_directive', constraint: 'format reference must contain a string id' };\n }\n const formats = Array.isArray(context.formats) ? context.formats : [];\n const format = formats.find(\n (candidate): candidate is JsonObject => isObject(candidate) && formatIdMatches(candidate.format_id, value)\n );\n if (!format) {\n const agent = typeof value.agent_url === 'string' ? ` from ${value.agent_url}` : '';\n return {\n ok: false,\n reason: 'format_not_found',\n constraint: `format \"${value.id}\"${agent} is absent from storyboard context.formats`,\n };\n }\n const catalogFormatId = isObject(format.format_id) ? format.format_id : {};\n return {\n ok: true,\n format: {\n ...format,\n ...(asNumber(value.width) !== undefined ? { width: value.width } : {}),\n ...(asNumber(value.height) !== undefined ? { height: value.height } : {}),\n format_id: { ...catalogFormatId, ...value },\n },\n };\n}\n\nfunction dimensionsFromId(format: JsonObject): Dimensions {\n const formatId = isObject(format.format_id) ? format.format_id.id : undefined;\n const match = typeof formatId === 'string' ? formatId.match(/(?:^|_)(\\d{2,4})x(\\d{2,4})(?:_|$)/i) : null;\n return match ? { width: Number(match[1]), height: Number(match[2]) } : {};\n}\n\nfunction formatDimensions(format: JsonObject): Dimensions {\n const nestedFormatId = isObject(format.format_id) ? format.format_id : {};\n const direct = {\n width: asNumber(format.width) ?? asNumber(nestedFormatId.width),\n height: asNumber(format.height) ?? asNumber(nestedFormatId.height),\n };\n if (direct.width !== undefined || direct.height !== undefined) return direct;\n\n const renders = Array.isArray(format.renders) ? format.renders : [];\n for (const render of renders) {\n if (!isObject(render)) continue;\n const dimensions = isObject(render.dimensions) ? render.dimensions : render;\n const width = asNumber(dimensions.width);\n const height = asNumber(dimensions.height);\n if (width !== undefined || height !== undefined) return { width, height };\n }\n\n return dimensionsFromId(format);\n}\n\nfunction slotDimensions(slot: JsonObject, fallback: Dimensions): Dimensions {\n const requirements = isObject(slot.requirements) ? slot.requirements : {};\n const nested = isObject(requirements.dimensions) ? requirements.dimensions : requirements;\n return {\n width: asNumber(slot.width) ?? asNumber(nested.width) ?? fallback.width,\n height: asNumber(slot.height) ?? asNumber(nested.height) ?? fallback.height,\n };\n}\n\nfunction requiredSlots(format: JsonObject): RequiredSlotsResult {\n const canonicalSlots = Array.isArray(format.slots) ? format.slots : undefined;\n const legacySlots = Array.isArray(format.assets)\n ? format.assets\n : Array.isArray(format.assets_required)\n ? format.assets_required\n : undefined;\n const usesAssetsRequired = canonicalSlots === undefined && !Array.isArray(format.assets) && legacySlots !== undefined;\n const slots = canonicalSlots ?? legacySlots ?? [];\n const fallback = formatDimensions(format);\n const container = canonicalSlots !== undefined ? 'slots' : usesAssetsRequired ? 'assets_required' : 'assets';\n\n const required: RequiredSlot[] = [];\n for (let index = 0; index < slots.length; index += 1) {\n const slotValue = slots[index];\n if (!isObject(slotValue) || (!usesAssetsRequired && slotValue.required !== true)) continue;\n const isRepeatableGroup = slotValue.item_type === 'repeatable_group';\n const id = canonicalSlots !== undefined || isRepeatableGroup ? slotValue.asset_group_id : slotValue.asset_id;\n const assetType =\n typeof slotValue.asset_type === 'string'\n ? slotValue.asset_type\n : isRepeatableGroup\n ? 'repeatable_group'\n : undefined;\n const idField = canonicalSlots !== undefined || isRepeatableGroup ? 'asset_group_id' : 'asset_id';\n if (typeof id !== 'string') {\n return { ok: false, constraint: `required ${container}[${index}].${idField} must be a string` };\n }\n if (assetType === undefined) {\n return { ok: false, constraint: `required ${container}[${index}].asset_type must be a string` };\n }\n const requirements = isObject(slotValue.requirements) ? slotValue.requirements : {};\n const dimensions = slotDimensions(slotValue, fallback);\n required.push({ id, assetType, requirements, ...dimensions });\n }\n return { ok: true, slots: required };\n}\n\nfunction imageConstraint(slot: RequiredSlot): string {\n if (slot.width !== undefined && slot.height !== undefined) {\n return `requires an exact ${slot.width}x${slot.height} image fixture`;\n }\n if (slot.width !== undefined) return `requires an image fixture with exact width ${slot.width}`;\n if (slot.height !== undefined) return `requires an image fixture with exact height ${slot.height}`;\n return 'requires an image fixture with a URL';\n}\n\nfunction imageFixtureMismatch(candidate: JsonObject, slot: RequiredSlot): string | undefined {\n const requirements = slot.requirements;\n const supported = new Set([\n 'width',\n 'height',\n 'dimensions',\n 'min_width',\n 'max_width',\n 'min_height',\n 'max_height',\n 'aspect_ratio',\n 'formats',\n 'pixel_ratios',\n 'parameters_from_format_id',\n 'unit',\n ]);\n const unsupported = Object.keys(requirements).find(key => !supported.has(key));\n if (unsupported) return `cannot verify image requirement \"${unsupported}\" from fixture metadata`;\n\n const unit = typeof requirements.unit === 'string' ? requirements.unit : 'px';\n if (unit !== 'px' && unit !== 'pixel' && unit !== 'pixels') {\n return `requires image dimensions in unsupported unit \"${unit}\"`;\n }\n\n const width = asNumber(candidate.width);\n const height = asNumber(candidate.height);\n const minWidth = asNumber(requirements.min_width);\n const maxWidth = asNumber(requirements.max_width);\n const minHeight = asNumber(requirements.min_height);\n const maxHeight = asNumber(requirements.max_height);\n if (minWidth !== undefined && (width === undefined || width < minWidth)) return `requires minimum width ${minWidth}`;\n if (maxWidth !== undefined && (width === undefined || width > maxWidth)) return `requires maximum width ${maxWidth}`;\n if (minHeight !== undefined && (height === undefined || height < minHeight)) {\n return `requires minimum height ${minHeight}`;\n }\n if (maxHeight !== undefined && (height === undefined || height > maxHeight)) {\n return `requires maximum height ${maxHeight}`;\n }\n\n if (typeof requirements.aspect_ratio === 'string') {\n const match = /^(\\d+(?:\\.\\d+)?):(\\d+(?:\\.\\d+)?)$/.exec(requirements.aspect_ratio);\n if (!match || width === undefined || height === undefined) {\n return `cannot verify aspect ratio \"${requirements.aspect_ratio}\"`;\n }\n const expected = Number(match[1]) / Number(match[2]);\n if (Math.abs(width / height - expected) > 0.001) return `requires aspect ratio ${requirements.aspect_ratio}`;\n }\n\n if (Array.isArray(requirements.formats)) {\n const mimeType = typeof candidate.mime_type === 'string' ? candidate.mime_type.toLowerCase() : '';\n const extension = mimeType.split('/')[1]?.replace('jpeg', 'jpg');\n const allowed = requirements.formats\n .filter((item): item is string => typeof item === 'string')\n .map(item => item.toLowerCase().replace('jpeg', 'jpg'));\n if (!extension || !allowed.includes(extension)) return `requires image format in [${allowed.join(', ')}]`;\n }\n\n if (Array.isArray(requirements.pixel_ratios)) {\n const ratio = asNumber(candidate.pixel_ratio) ?? 1;\n const allowed = requirements.pixel_ratios.filter((item): item is number => asNumber(item) !== undefined);\n if (!allowed.includes(ratio)) return `requires pixel ratio in [${allowed.join(', ')}]`;\n }\n return undefined;\n}\n\nfunction buildImage(slot: RequiredSlot, assets: JsonObject): AssetBuildResult {\n const images = Array.isArray(assets.images) ? assets.images.filter(isObject) : [];\n let mismatch: string | undefined;\n const image = images.find(candidate => {\n const widthMatches = slot.width === undefined || candidate.width === slot.width;\n const heightMatches = slot.height === undefined || candidate.height === slot.height;\n if (!widthMatches || !heightMatches) return false;\n const candidateMismatch = imageFixtureMismatch(candidate, slot);\n if (candidateMismatch) {\n mismatch ??= candidateMismatch;\n return false;\n }\n return true;\n });\n if (!image) {\n return { ok: false, constraint: mismatch ? `${imageConstraint(slot)}; ${mismatch}` : imageConstraint(slot) };\n }\n if (typeof image.url !== 'string') {\n return { ok: false, constraint: `${imageConstraint(slot)}, but the matching fixture has no URL` };\n }\n return {\n ok: true,\n asset: {\n asset_type: 'image',\n url: image.url,\n ...(asNumber(image.width) !== undefined ? { width: image.width } : {}),\n ...(asNumber(image.height) !== undefined ? { height: image.height } : {}),\n ...(typeof image.mime_type === 'string' ? { mime_type: image.mime_type } : {}),\n },\n };\n}\n\nfunction textFixtureMismatch(content: string, requirements: JsonObject): string | undefined {\n const supported = new Set([\n 'min_length',\n 'max_length',\n 'min_lines',\n 'max_lines',\n 'prohibited_terms',\n 'allowed_values',\n ]);\n const unsupported = Object.keys(requirements).find(key => !supported.has(key));\n if (unsupported) return `cannot verify text requirement \"${unsupported}\"`;\n\n const minLength = asNumber(requirements.min_length);\n const maxLength = asNumber(requirements.max_length);\n if (minLength !== undefined && content.length < minLength) return `requires minimum length ${minLength}`;\n if (maxLength !== undefined && content.length > maxLength) return `requires maximum length ${maxLength}`;\n\n const lines = content.split(/\\r?\\n/).length;\n const minLines = asNumber(requirements.min_lines);\n const maxLines = asNumber(requirements.max_lines);\n if (minLines !== undefined && lines < minLines) return `requires minimum line count ${minLines}`;\n if (maxLines !== undefined && lines > maxLines) return `requires maximum line count ${maxLines}`;\n\n if (Array.isArray(requirements.prohibited_terms)) {\n const prohibited = requirements.prohibited_terms.find(\n (term): term is string => typeof term === 'string' && content.toLowerCase().includes(term.toLowerCase())\n );\n if (prohibited) return `prohibits term \"${prohibited}\"`;\n }\n if (\n Array.isArray(requirements.allowed_values) &&\n !requirements.allowed_values.some(value => typeof value === 'string' && value === content)\n ) {\n return 'requires one of the declared allowed_values';\n }\n return undefined;\n}\n\nfunction buildText(slot: RequiredSlot, assets: JsonObject): AssetBuildResult {\n const text = isObject(assets.text) ? assets.text : {};\n const id = slot.id.toLowerCase();\n const fixtureCategory = {\n headline: 'headlines',\n title: 'headlines',\n description: 'descriptions',\n body: 'descriptions',\n body_text: 'descriptions',\n primary_text: 'descriptions',\n cta: 'cta',\n cta_text: 'cta',\n call_to_action: 'cta',\n }[id];\n if (fixtureCategory === undefined) {\n return {\n ok: false,\n constraint: 'slot id has no exact runner mapping to a headlines, descriptions, or CTA fixture category',\n };\n }\n const candidates = Array.isArray(text[fixtureCategory])\n ? text[fixtureCategory].filter((item): item is string => typeof item === 'string')\n : [];\n let mismatch: string | undefined;\n const content = candidates.find(candidate => {\n const candidateMismatch = textFixtureMismatch(candidate, slot.requirements);\n if (candidateMismatch) {\n mismatch ??= candidateMismatch;\n return false;\n }\n return true;\n });\n return content === undefined\n ? {\n ok: false,\n constraint: mismatch ?? `requires a ${fixtureCategory} text fixture`,\n }\n : { ok: true, asset: { asset_type: 'text', content } };\n}\n\nfunction containsUrlMacro(value: string): boolean {\n let inMacro = false;\n let hasContent = false;\n for (let index = 0; index < value.length; index += 1) {\n if (!inMacro) {\n if (value[index] === '$' && value[index + 1] === '{') {\n inMacro = true;\n hasContent = false;\n index += 1;\n }\n continue;\n }\n if (value[index] === '}') {\n if (hasContent) return true;\n inMacro = false;\n continue;\n }\n hasContent = true;\n }\n return false;\n}\n\nfunction buildUrl(slot: RequiredSlot, assets: JsonObject): AssetBuildResult {\n if (typeof assets.click_url !== 'string') return { ok: false, constraint: 'requires a click_url fixture' };\n const url = assets.click_url;\n const supported = new Set(['role', 'protocols', 'allowed_domains', 'max_length', 'macro_support']);\n const unsupported = Object.keys(slot.requirements).find(key => !supported.has(key));\n if (unsupported) return { ok: false, constraint: `cannot verify URL requirement \"${unsupported}\"` };\n const maxLength = asNumber(slot.requirements.max_length);\n if (maxLength !== undefined && url.length > maxLength) {\n return { ok: false, constraint: `requires URL maximum length ${maxLength}` };\n }\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return { ok: false, constraint: 'click_url fixture is not an absolute URL' };\n }\n if (\n Array.isArray(slot.requirements.protocols) &&\n !slot.requirements.protocols.some(protocol => protocol === parsed.protocol.replace(/:$/, ''))\n ) {\n return { ok: false, constraint: 'click_url fixture uses a disallowed protocol' };\n }\n if (\n Array.isArray(slot.requirements.allowed_domains) &&\n !slot.requirements.allowed_domains.some(domain => domain === parsed.hostname)\n ) {\n return { ok: false, constraint: 'click_url fixture uses a disallowed domain' };\n }\n if (slot.requirements.macro_support === true && !containsUrlMacro(url)) {\n return { ok: false, constraint: 'requires a URL fixture with macro support' };\n }\n return { ok: true, asset: { asset_type: 'url', url } };\n}\n\nfunction buildAsset(slot: RequiredSlot, testKit: unknown): AssetBuildResult {\n if (!isObject(testKit) || !isObject(testKit.assets)) {\n return { ok: false, constraint: 'selected test kit does not declare asset fixtures' };\n }\n const assets = testKit.assets;\n if (slot.assetType === 'image') return buildImage(slot, assets);\n if (slot.assetType === 'url') return buildUrl(slot, assets);\n if (slot.assetType === 'text') return buildText(slot, assets);\n return { ok: false, constraint: `asset type \"${slot.assetType}\" is not supported by the selected test kit` };\n}\n\nfunction buildAssets(value: unknown, context: StoryboardContext, testKit: unknown): AssetsBuildResult {\n const resolved = resolveFormat(value, context);\n if (!resolved.ok) {\n return { ok: false, failure: { reason: resolved.reason, constraint: resolved.constraint } };\n }\n const required = requiredSlots(resolved.format);\n if (!required.ok) {\n return { ok: false, failure: { reason: 'malformed_directive', constraint: required.constraint } };\n }\n\n const built: JsonObject = {};\n for (const slot of required.slots) {\n const result = buildAsset(slot, testKit);\n if (!result.ok) {\n return {\n ok: false,\n failure: {\n reason: 'fixture_unavailable',\n slotId: slot.id,\n assetType: slot.assetType,\n constraint: result.constraint,\n },\n };\n }\n built[slot.id] = result.asset;\n }\n return { ok: true, assets: built };\n}\n\nfunction expandWithDiagnostics(\n value: unknown,\n context: StoryboardContext,\n testKit: unknown,\n path: string\n): CreativeAssetExpansionResult {\n if (Array.isArray(value)) {\n const expanded = Array.from(value as unknown[]);\n for (let index = 0; index < value.length; index += 1) {\n const result = expandWithDiagnostics(value[index], context, testKit, `${path}[${index}]`);\n expanded[index] = result.value;\n if (!result.ok) return { ...result, value: expanded };\n }\n return { ok: true, value: expanded };\n }\n if (!isObject(value)) return { ok: true, value };\n\n if (Object.prototype.hasOwnProperty.call(value, BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)) {\n const built = buildAssets(value[BUILD_ASSETS_FROM_FORMAT_DIRECTIVE], context, testKit);\n if (!built.ok) {\n return {\n ok: false,\n value,\n failure: {\n ...built.failure,\n path: `${path}.${BUILD_ASSETS_FROM_FORMAT_DIRECTIVE}`,\n },\n };\n }\n const siblings: JsonObject = Object.fromEntries(\n Object.entries(value).filter(([key]) => key !== BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)\n );\n for (const [key, item] of Object.entries(value)) {\n if (key === BUILD_ASSETS_FROM_FORMAT_DIRECTIVE) continue;\n const result = expandWithDiagnostics(item, context, testKit, `${path}.${key}`);\n siblings[key] = result.value;\n if (!result.ok) return { ...result, value: { ...siblings, ...built.assets } };\n }\n return { ok: true, value: { ...siblings, ...built.assets } };\n }\n\n const expanded: JsonObject = { ...value };\n for (const [key, item] of Object.entries(value)) {\n const result = expandWithDiagnostics(item, context, testKit, `${path}.${key}`);\n expanded[key] = result.value;\n if (!result.ok) return { ...result, value: expanded };\n }\n return { ok: true, value: expanded };\n}\n\n/** Expand reserved storyboard creative-asset directives and preserve the first failure diagnostic. */\nexport function expandCreativeAssetDirectivesWithDiagnostics(\n value: unknown,\n context: StoryboardContext,\n testKit: unknown\n): CreativeAssetExpansionResult {\n return expandWithDiagnostics(value, context, testKit, '$');\n}\n\n/** Expand reserved storyboard creative-asset directives without mutating the fixture. */\nexport function expandCreativeAssetDirectives(value: unknown, context: StoryboardContext, testKit: unknown): unknown {\n return expandCreativeAssetDirectivesWithDiagnostics(value, context, testKit).value;\n}\n\nexport function findUnresolvedCreativeAssetDirectives(value: unknown): string[] {\n const paths: string[] = [];\n const walk = (item: unknown, path: string) => {\n if (Array.isArray(item)) {\n item.forEach((entry, index) => walk(entry, `${path}[${index}]`));\n return;\n }\n if (!isObject(item)) return;\n if (Object.prototype.hasOwnProperty.call(item, BUILD_ASSETS_FROM_FORMAT_DIRECTIVE)) {\n paths.push(`${path}.${BUILD_ASSETS_FROM_FORMAT_DIRECTIVE}`);\n }\n Object.entries(item).forEach(([key, entry]) => walk(entry, path ? `${path}.${key}` : key));\n };\n walk(value, '$');\n return paths;\n}\n"],"mappings":"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","names":["expanded"]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* The canonical storyboard set lives in the AdCP compliance tarball
|
|
7
7
|
* and is pulled into `compliance/cache/{version}/` via `npm run sync-schemas`.
|
|
8
8
|
*/
|
|
9
|
-
export type { A2ATaskEnvelope, AgentEntry, Storyboard, StoryboardFixtureResolution, FixtureResolutionStrategy, FixtureMatchOperator, FixtureMatchClause, FixtureResolutionDeclaration, ProductFixtureResolutionDeclaration, PricingOptionFixtureResolutionDeclaration, FixtureResolutionStatus, FixtureResolutionRecord, FixtureResolutionAttempt, FixtureResolutionEvidence, FixtureResolutionCoverageGap, StoryboardInvariants, StoryboardInvariantsObject, StepInvariantsObject, StoryboardPhase, StoryboardStep, RateLimitTripSpec, StoryboardValidation, StoryboardValidationCheck, WebhookFilterSpec, WebhookRetryTriggerSpec, WebhookAssertionErrorCode, ContextOutput, ContextInput, ContextProvenanceEntry, ContextValueRejectedHint, ShapeDriftHint, MissingRequiredFieldHint, FormatMismatchHint, MonotonicViolationHint, ImpairmentCoherenceHint, ImpairmentCoherenceNotApplicableHint, StoryboardContext, StoryboardRunOptions, ValidationResult, StoryboardStepPreview, StoryboardStepResult, StoryboardStepHint, StoryboardStepHintBase, StoryboardPhaseResult, StoryboardResult, AssertionResult, StrictValidationSummary, StrictValidationVerdict, UpstreamTrafficPayloadMatch, RunnerNotice, NoticeCode, NoticeSeverity, } from './types.mjs';
|
|
9
|
+
export type { A2ATaskEnvelope, AgentEntry, Storyboard, StoryboardFixtureResolution, FixtureResolutionStrategy, FixtureMatchOperator, FixtureMatchClause, FixtureResolutionDeclaration, ProductFixtureResolutionDeclaration, PricingOptionFixtureResolutionDeclaration, FixtureResolutionStatus, FixtureResolutionRecord, FixtureResolutionAttempt, FixtureResolutionEvidence, FixtureResolutionCoverageGap, StoryboardInvariants, StoryboardInvariantsObject, StepInvariantsObject, StoryboardPhase, StoryboardStep, RateLimitTripSpec, StoryboardValidation, StoryboardValidationCheck, WebhookFilterSpec, WebhookRetryTriggerSpec, WebhookAssertionErrorCode, ContextOutput, ContextInput, ContextProvenanceEntry, ContextValueRejectedHint, ShapeDriftHint, MissingRequiredFieldHint, FormatMismatchHint, MonotonicViolationHint, ImpairmentCoherenceHint, ImpairmentCoherenceNotApplicableHint, StoryboardContext, StoryboardRunOptions, TrustedMatchContextProviderEndpoint, TrustedMatchContextRegistrationContext, TrustedMatchContextRouterRunnerOptions, ValidationResult, StoryboardStepPreview, StoryboardStepResult, StoryboardStepHint, StoryboardStepHintBase, StoryboardPhaseResult, StoryboardResult, AssertionResult, StrictValidationSummary, StrictValidationVerdict, UpstreamTrafficPayloadMatch, RunnerNotice, NoticeCode, NoticeSeverity, } from './types.mjs';
|
|
10
10
|
export { WEBHOOK_IDEMPOTENCY_KEY_PATTERN } from './types.mjs';
|
|
11
11
|
export { registerAssertion, getAssertion, listAssertions, listDefaultAssertions, clearAssertionRegistry, resolveAssertions, } from './assertions.mjs';
|
|
12
12
|
export type { AssertionSpec, AssertionContext, RegisterAssertionOptions } from './assertions.mjs';
|
|
@@ -21,12 +21,15 @@ export { applyFixtureBindingsToRequest, buildFixtureResolutionSpecs, FixtureBind
|
|
|
21
21
|
export { getComplianceCacheDir, getExternalSchemaRootForCompliance, loadComplianceIndex, listBundles, loadBundleStoryboards, listAllComplianceStoryboards, getComplianceStoryboardById, findBundleById, resolveBundleOrStoryboard, resolveStoryboardsForCapabilities, isComplianceVersionSupported, loadSpecialismDetail, listSpecialisms, CapabilityResolutionError, PROTOCOL_TO_PATH, UNBASELINED_SUPPORTED_PROTOCOLS, } from './compliance.mjs';
|
|
22
22
|
export type { AgentCapabilities, BundleKind, BundleRef, CapabilityResolutionCode, ComplianceIndex, ComplianceIndexProtocol, ComplianceIndexSpecialism, NotApplicableStoryboard, ResolveOptions, ResolvedBundle, ResolvedStoryboards, SpecialismDetail, } from './compliance.mjs';
|
|
23
23
|
export { TASK_TO_METHOD, executeStoryboardTask } from './task-map.mjs';
|
|
24
|
+
export { expandCreativeAssetDirectives, findUnresolvedCreativeAssetDirectives } from './creative-assets.mjs';
|
|
24
25
|
export { parsePath, resolvePath, setPath } from './path.mjs';
|
|
25
26
|
export { CONTEXT_EXTRACTORS, extractContext, extractContextWithProvenance, injectContext, applyContextOutputs, applyContextOutputsWithProvenance, applyContextInputs, } from './context.mjs';
|
|
26
27
|
export type { ContextWriteResult } from './context.mjs';
|
|
27
28
|
export { detectContextRejectionHints } from './rejection-hints.mjs';
|
|
28
29
|
export { buildRequest, hasRequestBuilder } from './request-builder.mjs';
|
|
29
30
|
export { runValidations } from './validations.mjs';
|
|
31
|
+
export { gradeOAuthMetadataGraph, gradeOAuthMetadataGraphVector, loadOAuthMetadataGraphVectors, buildAuthorizationServerMetadataUrl, buildProtectedResourceMetadataUrl, normalizeOAuthResourceForComparison, redactOAuthUrlForOutput, } from './oauth-metadata-graph/index.mjs';
|
|
32
|
+
export type { GradeOAuthMetadataGraphOptions, OAuthMetadataFetchResponse, OAuthMetadataFetchTransport, OAuthMetadataGraphErrorCode, OAuthMetadataGraphFinding, OAuthMetadataGraphGrade, OAuthMetadataGraphObservation, OAuthMetadataGraphVector, OAuthMetadataGraphVectorCorpus, } from './oauth-metadata-graph/index.mjs';
|
|
30
33
|
export { RateLimitTripObserver, RATE_LIMIT_TRIP_CONTRACT, RATE_LIMIT_TRIP_DEFAULT_REPLAY_MAX_WAIT_SECONDS, RATE_LIMIT_TRIP_MAX_ATTEMPTS_MAX, RATE_LIMIT_TRIP_MAX_ATTEMPTS_MIN, extractTaskAdcpError, validateRateLimitTripSpec, type RateLimitTripFailureCode, type RateLimitTripClient, type RateLimitTripObservation, type RateLimitTripObserverOptions, type RateLimitTripResponseSnapshot, type RateLimitTripStructuredResult, type RateLimitTripTaskOptions, } from './rate-limit-trip.mjs';
|
|
31
34
|
export type { SandboxBrand, SandboxAgent, SandboxEntities, BrandJson } from './sandbox-entities.mjs';
|
|
32
35
|
export { BrandJsonSchema, AdagentsJsonSchema } from '../../types/wellknown-schemas.generated.mjs';
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* The canonical storyboard set lives in the AdCP compliance tarball
|
|
7
7
|
* and is pulled into `compliance/cache/{version}/` via `npm run sync-schemas`.
|
|
8
8
|
*/
|
|
9
|
-
export type { A2ATaskEnvelope, AgentEntry, Storyboard, StoryboardFixtureResolution, FixtureResolutionStrategy, FixtureMatchOperator, FixtureMatchClause, FixtureResolutionDeclaration, ProductFixtureResolutionDeclaration, PricingOptionFixtureResolutionDeclaration, FixtureResolutionStatus, FixtureResolutionRecord, FixtureResolutionAttempt, FixtureResolutionEvidence, FixtureResolutionCoverageGap, StoryboardInvariants, StoryboardInvariantsObject, StepInvariantsObject, StoryboardPhase, StoryboardStep, RateLimitTripSpec, StoryboardValidation, StoryboardValidationCheck, WebhookFilterSpec, WebhookRetryTriggerSpec, WebhookAssertionErrorCode, ContextOutput, ContextInput, ContextProvenanceEntry, ContextValueRejectedHint, ShapeDriftHint, MissingRequiredFieldHint, FormatMismatchHint, MonotonicViolationHint, ImpairmentCoherenceHint, ImpairmentCoherenceNotApplicableHint, StoryboardContext, StoryboardRunOptions, ValidationResult, StoryboardStepPreview, StoryboardStepResult, StoryboardStepHint, StoryboardStepHintBase, StoryboardPhaseResult, StoryboardResult, AssertionResult, StrictValidationSummary, StrictValidationVerdict, UpstreamTrafficPayloadMatch, RunnerNotice, NoticeCode, NoticeSeverity, } from './types';
|
|
9
|
+
export type { A2ATaskEnvelope, AgentEntry, Storyboard, StoryboardFixtureResolution, FixtureResolutionStrategy, FixtureMatchOperator, FixtureMatchClause, FixtureResolutionDeclaration, ProductFixtureResolutionDeclaration, PricingOptionFixtureResolutionDeclaration, FixtureResolutionStatus, FixtureResolutionRecord, FixtureResolutionAttempt, FixtureResolutionEvidence, FixtureResolutionCoverageGap, StoryboardInvariants, StoryboardInvariantsObject, StepInvariantsObject, StoryboardPhase, StoryboardStep, RateLimitTripSpec, StoryboardValidation, StoryboardValidationCheck, WebhookFilterSpec, WebhookRetryTriggerSpec, WebhookAssertionErrorCode, ContextOutput, ContextInput, ContextProvenanceEntry, ContextValueRejectedHint, ShapeDriftHint, MissingRequiredFieldHint, FormatMismatchHint, MonotonicViolationHint, ImpairmentCoherenceHint, ImpairmentCoherenceNotApplicableHint, StoryboardContext, StoryboardRunOptions, TrustedMatchContextProviderEndpoint, TrustedMatchContextRegistrationContext, TrustedMatchContextRouterRunnerOptions, ValidationResult, StoryboardStepPreview, StoryboardStepResult, StoryboardStepHint, StoryboardStepHintBase, StoryboardPhaseResult, StoryboardResult, AssertionResult, StrictValidationSummary, StrictValidationVerdict, UpstreamTrafficPayloadMatch, RunnerNotice, NoticeCode, NoticeSeverity, } from './types';
|
|
10
10
|
export { WEBHOOK_IDEMPOTENCY_KEY_PATTERN } from './types';
|
|
11
11
|
export { registerAssertion, getAssertion, listAssertions, listDefaultAssertions, clearAssertionRegistry, resolveAssertions, } from './assertions';
|
|
12
12
|
export type { AssertionSpec, AssertionContext, RegisterAssertionOptions } from './assertions';
|
|
@@ -21,12 +21,15 @@ export { applyFixtureBindingsToRequest, buildFixtureResolutionSpecs, FixtureBind
|
|
|
21
21
|
export { getComplianceCacheDir, getExternalSchemaRootForCompliance, loadComplianceIndex, listBundles, loadBundleStoryboards, listAllComplianceStoryboards, getComplianceStoryboardById, findBundleById, resolveBundleOrStoryboard, resolveStoryboardsForCapabilities, isComplianceVersionSupported, loadSpecialismDetail, listSpecialisms, CapabilityResolutionError, PROTOCOL_TO_PATH, UNBASELINED_SUPPORTED_PROTOCOLS, } from './compliance';
|
|
22
22
|
export type { AgentCapabilities, BundleKind, BundleRef, CapabilityResolutionCode, ComplianceIndex, ComplianceIndexProtocol, ComplianceIndexSpecialism, NotApplicableStoryboard, ResolveOptions, ResolvedBundle, ResolvedStoryboards, SpecialismDetail, } from './compliance';
|
|
23
23
|
export { TASK_TO_METHOD, executeStoryboardTask } from './task-map';
|
|
24
|
+
export { expandCreativeAssetDirectives, findUnresolvedCreativeAssetDirectives } from './creative-assets';
|
|
24
25
|
export { parsePath, resolvePath, setPath } from './path';
|
|
25
26
|
export { CONTEXT_EXTRACTORS, extractContext, extractContextWithProvenance, injectContext, applyContextOutputs, applyContextOutputsWithProvenance, applyContextInputs, } from './context';
|
|
26
27
|
export type { ContextWriteResult } from './context';
|
|
27
28
|
export { detectContextRejectionHints } from './rejection-hints';
|
|
28
29
|
export { buildRequest, hasRequestBuilder } from './request-builder';
|
|
29
30
|
export { runValidations } from './validations';
|
|
31
|
+
export { gradeOAuthMetadataGraph, gradeOAuthMetadataGraphVector, loadOAuthMetadataGraphVectors, buildAuthorizationServerMetadataUrl, buildProtectedResourceMetadataUrl, normalizeOAuthResourceForComparison, redactOAuthUrlForOutput, } from './oauth-metadata-graph';
|
|
32
|
+
export type { GradeOAuthMetadataGraphOptions, OAuthMetadataFetchResponse, OAuthMetadataFetchTransport, OAuthMetadataGraphErrorCode, OAuthMetadataGraphFinding, OAuthMetadataGraphGrade, OAuthMetadataGraphObservation, OAuthMetadataGraphVector, OAuthMetadataGraphVectorCorpus, } from './oauth-metadata-graph';
|
|
30
33
|
export { RateLimitTripObserver, RATE_LIMIT_TRIP_CONTRACT, RATE_LIMIT_TRIP_DEFAULT_REPLAY_MAX_WAIT_SECONDS, RATE_LIMIT_TRIP_MAX_ATTEMPTS_MAX, RATE_LIMIT_TRIP_MAX_ATTEMPTS_MIN, extractTaskAdcpError, validateRateLimitTripSpec, type RateLimitTripFailureCode, type RateLimitTripClient, type RateLimitTripObservation, type RateLimitTripObserverOptions, type RateLimitTripResponseSnapshot, type RateLimitTripStructuredResult, type RateLimitTripTaskOptions, } from './rate-limit-trip';
|
|
31
34
|
export type { SandboxBrand, SandboxAgent, SandboxEntities, BrandJson } from './sandbox-entities';
|
|
32
35
|
export { BrandJsonSchema, AdagentsJsonSchema } from '../../types/wellknown-schemas.generated';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/testing/storyboard/index.ts"],"names":[],"mappings":"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"}
|