@adcp/sdk 6.7.0 → 6.8.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.
- package/bin/adcp.js +15 -3
- package/dist/lib/adapters/derived-account-store.d.ts +152 -0
- package/dist/lib/adapters/derived-account-store.d.ts.map +1 -0
- package/dist/lib/adapters/derived-account-store.js +135 -0
- package/dist/lib/adapters/derived-account-store.js.map +1 -0
- package/dist/lib/adapters/implicit-account-store.d.ts +3 -1
- package/dist/lib/adapters/implicit-account-store.d.ts.map +1 -1
- package/dist/lib/adapters/implicit-account-store.js +3 -1
- package/dist/lib/adapters/implicit-account-store.js.map +1 -1
- package/dist/lib/adapters/index.d.ts +1 -0
- package/dist/lib/adapters/index.d.ts.map +1 -1
- package/dist/lib/adapters/index.js +7 -1
- package/dist/lib/adapters/index.js.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.d.ts +3 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.d.ts.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.js +3 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.js.map +1 -1
- package/dist/lib/adapters/roster-account-store.d.ts +85 -24
- package/dist/lib/adapters/roster-account-store.d.ts.map +1 -1
- package/dist/lib/adapters/roster-account-store.js +52 -30
- package/dist/lib/adapters/roster-account-store.js.map +1 -1
- package/dist/lib/index.d.ts +3 -3
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +13 -8
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts +81 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.js +200 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.js.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/server.d.ts +39 -0
- package/dist/lib/mock-server/creative-ad-server/server.d.ts.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/server.js +618 -0
- package/dist/lib/mock-server/creative-ad-server/server.js.map +1 -0
- package/dist/lib/mock-server/index.d.ts.map +1 -1
- package/dist/lib/mock-server/index.js +180 -24
- package/dist/lib/mock-server/index.js.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts +66 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js +193 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts +33 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.js +782 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.js.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts +50 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.js +133 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.js.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.d.ts +13 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.d.ts.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.js +609 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.js.map +1 -0
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +1 -41
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/account-mode.d.ts +113 -0
- package/dist/lib/server/account-mode.d.ts.map +1 -0
- package/dist/lib/server/account-mode.js +125 -0
- package/dist/lib/server/account-mode.js.map +1 -0
- package/dist/lib/server/adcp-server.js +41 -0
- package/dist/lib/server/adcp-server.js.map +1 -1
- package/dist/lib/server/auth.d.ts +35 -0
- package/dist/lib/server/auth.d.ts.map +1 -1
- package/dist/lib/server/auth.js.map +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +26 -9
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +46 -20
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/ctx-metadata/store.d.ts +1 -1
- package/dist/lib/server/ctx-metadata/store.d.ts.map +1 -1
- package/dist/lib/server/ctx-metadata/store.js +1 -0
- package/dist/lib/server/ctx-metadata/store.js.map +1 -1
- package/dist/lib/server/decisioning/account.d.ts +5 -0
- 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/buyer-agent.d.ts +37 -4
- package/dist/lib/server/decisioning/buyer-agent.d.ts.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.js +12 -2
- package/dist/lib/server/decisioning/buyer-agent.js.map +1 -1
- package/dist/lib/server/decisioning/compose.d.ts +33 -2
- package/dist/lib/server/decisioning/compose.d.ts.map +1 -1
- package/dist/lib/server/decisioning/compose.js +13 -46
- package/dist/lib/server/decisioning/compose.js.map +1 -1
- package/dist/lib/server/decisioning/index.d.ts +2 -1
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js +2 -1
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/platform-helpers.d.ts +18 -0
- package/dist/lib/server/decisioning/platform-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/platform-helpers.js +20 -0
- package/dist/lib/server/decisioning/platform-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/platform.d.ts +19 -21
- package/dist/lib/server/decisioning/platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +334 -44
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/observed-modes.d.ts +40 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.js +82 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js +2 -2
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.js +9 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts +125 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js +52 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js.map +1 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts +16 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/tenant-registry.js.map +1 -1
- package/dist/lib/server/index.d.ts +4 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +9 -3
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/serve.js +20 -2
- package/dist/lib/server/serve.js.map +1 -1
- package/dist/lib/server/test-controller.d.ts +3 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -1
- package/dist/lib/server/test-controller.js +23 -20
- package/dist/lib/server/test-controller.js.map +1 -1
- package/dist/lib/testing/comply-controller.d.ts +23 -2
- package/dist/lib/testing/comply-controller.d.ts.map +1 -1
- package/dist/lib/testing/comply-controller.js +19 -2
- package/dist/lib/testing/comply-controller.js.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +36 -54
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/test-controller.d.ts +10 -4
- package/dist/lib/testing/test-controller.d.ts.map +1 -1
- package/dist/lib/testing/test-controller.js +9 -3
- package/dist/lib/testing/test-controller.js.map +1 -1
- package/dist/lib/types/index.d.ts +3 -2
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +3 -0
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/utils/glob.d.ts +4 -2
- package/dist/lib/utils/glob.d.ts.map +1 -1
- package/dist/lib/utils/glob.js +4 -2
- package/dist/lib/utils/glob.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/docs/llms.txt +2 -2
- package/examples/README.md +29 -13
- package/examples/hello-cluster.ts +62 -23
- package/examples/hello_creative_adapter_ad_server.ts +790 -0
- package/examples/hello_seller_adapter_guaranteed.ts +80 -22
- package/examples/hello_seller_adapter_non_guaranteed.ts +1020 -0
- package/examples/hello_si_adapter_brand.ts +572 -0
- package/package.json +3 -2
- package/skills/build-creative-agent/SKILL.md +103 -183
- package/skills/build-generative-seller-agent/SKILL.md +15 -9
- package/skills/build-governance-agent/SKILL.md +20 -11
- package/skills/build-retail-media-agent/SKILL.md +10 -8
- package/skills/build-seller-agent/SKILL.md +15 -13
- package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +9 -31
- package/skills/build-si-agent/SKILL.md +251 -196
- package/skills/build-signals-agent/SKILL.md +2 -0
- package/skills/call-adcp-agent/SKILL.md +7 -1
- package/skills/call-adcp-agent.previous/SKILL.md +0 -261
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `creative-ad-server` upstream-shape seed data. Mirrors the GAM-creative /
|
|
3
|
+
* Innovid / Flashtalking / CM360 model: per-network format catalog, stateful
|
|
4
|
+
* creative library (writeable via POST /v1/creatives), tag generation against
|
|
5
|
+
* stored snippet templates with macro substitution.
|
|
6
|
+
*
|
|
7
|
+
* The library is *stateful* (vs `creative-template`'s stateless transform):
|
|
8
|
+
* `POST /v1/creatives` writes; `GET /v1/creatives` reads; `PATCH` mutates;
|
|
9
|
+
* `POST /v1/creatives/{id}/render` substitutes macros and returns a tag URL.
|
|
10
|
+
*
|
|
11
|
+
* Format renders[] use the closed-shape `displayRender` / `parameterizedRender`
|
|
12
|
+
* pattern (codegen tightening from #1325) so adapter projection composes
|
|
13
|
+
* with `Format.renders[]` typed builders without `as` casts.
|
|
14
|
+
*/
|
|
15
|
+
import type { Format } from '../../types';
|
|
16
|
+
export declare const DEFAULT_API_KEY = "mock_creative_ad_server_key_do_not_use_in_prod";
|
|
17
|
+
export interface MockNetwork {
|
|
18
|
+
network_code: string;
|
|
19
|
+
display_name: string;
|
|
20
|
+
/** AdCP-side identifier the adapter uses to map principal → network. */
|
|
21
|
+
adcp_publisher: string;
|
|
22
|
+
}
|
|
23
|
+
export interface MockFormat {
|
|
24
|
+
format_id: string;
|
|
25
|
+
network_code: string;
|
|
26
|
+
/** Human-readable name. */
|
|
27
|
+
name: string;
|
|
28
|
+
/** display | video | ctv | audio. The `Format` type doesn't carry a
|
|
29
|
+
* top-level kind field; we project to closed-shape `renders[]` per
|
|
30
|
+
* format. This stays on the upstream side for catalog filtering. */
|
|
31
|
+
channel: 'display' | 'video' | 'ctv' | 'audio';
|
|
32
|
+
/** Render kind drives the adapter's projection — we surface the
|
|
33
|
+
* closed-shape `Format.renders[]` from this. */
|
|
34
|
+
render_kind: 'fixed' | 'parameterized';
|
|
35
|
+
width?: number;
|
|
36
|
+
height?: number;
|
|
37
|
+
duration_seconds?: number;
|
|
38
|
+
/** MIME types the format accepts on upload. Mock uses these to
|
|
39
|
+
* auto-detect format from upload mime in handleCreateCreative. */
|
|
40
|
+
accepted_mimes: string[];
|
|
41
|
+
/** Snippet template stored with the format. Substitutes
|
|
42
|
+
* `{click_url}`, `{impression_pixel}`, `{cb}`, `{advertiser_id}`,
|
|
43
|
+
* `{creative_id}`, `{width}`, `{height}` at render time. */
|
|
44
|
+
snippet_template: string;
|
|
45
|
+
}
|
|
46
|
+
export interface MockCreative {
|
|
47
|
+
creative_id: string;
|
|
48
|
+
network_code: string;
|
|
49
|
+
advertiser_id: string;
|
|
50
|
+
format_id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
/** Snippet body — overrides the format's template if set. Otherwise
|
|
53
|
+
* the format's `snippet_template` is used at render time. */
|
|
54
|
+
snippet?: string;
|
|
55
|
+
status: 'active' | 'paused' | 'archived' | 'rejected';
|
|
56
|
+
click_url?: string;
|
|
57
|
+
/** ISO 8601 created_at — used by `?created_after=` filter and to
|
|
58
|
+
* scale synth delivery (older creatives have more delivery). */
|
|
59
|
+
created_at: string;
|
|
60
|
+
updated_at: string;
|
|
61
|
+
}
|
|
62
|
+
export declare const NETWORKS: MockNetwork[];
|
|
63
|
+
/** Replicate base formats across every network for catalog lookups. */
|
|
64
|
+
export declare const FORMATS: MockFormat[];
|
|
65
|
+
/**
|
|
66
|
+
* Seed creatives — 3 pre-loaded library entries the storyboard runner can
|
|
67
|
+
* read on `GET /v1/creatives` without first POSTing. Production would
|
|
68
|
+
* have an empty seed; these exist so the storyboard's `read-only` checks
|
|
69
|
+
* (list + filter) have something to return on a clean boot.
|
|
70
|
+
*/
|
|
71
|
+
export declare const CREATIVES: MockCreative[];
|
|
72
|
+
/**
|
|
73
|
+
* Project an upstream `MockFormat` to the closed-shape `Format` shape the
|
|
74
|
+
* mock surfaces on `GET /v1/formats`. Adapters consume this directly.
|
|
75
|
+
*
|
|
76
|
+
* Format.renders[] uses the closed-shape `displayRender` / `parameterizedRender`
|
|
77
|
+
* convention from #1325 — `dimensions: { width, height, unit }` for fixed,
|
|
78
|
+
* `accepts_parameters[]` for parameterized.
|
|
79
|
+
*/
|
|
80
|
+
export declare function projectFormat(format: MockFormat, agentUrl: string): Format;
|
|
81
|
+
//# sourceMappingURL=seed-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-data.d.ts","sourceRoot":"","sources":["../../../../src/lib/mock-server/creative-ad-server/seed-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,eAAO,MAAM,eAAe,mDAAmD,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb;;yEAEqE;IACrE,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAC/C;qDACiD;IACjD,WAAW,EAAE,OAAO,GAAG,eAAe,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;uEACmE;IACnE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;iEAE6D;IAC7D,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb;kEAC8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;qEACiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,EAAE,WAAW,EAgBjC,CAAC;AAqFF,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,UAAU,EAE/B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,YAAY,EAqCnC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoC1E"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `creative-ad-server` upstream-shape seed data. Mirrors the GAM-creative /
|
|
4
|
+
* Innovid / Flashtalking / CM360 model: per-network format catalog, stateful
|
|
5
|
+
* creative library (writeable via POST /v1/creatives), tag generation against
|
|
6
|
+
* stored snippet templates with macro substitution.
|
|
7
|
+
*
|
|
8
|
+
* The library is *stateful* (vs `creative-template`'s stateless transform):
|
|
9
|
+
* `POST /v1/creatives` writes; `GET /v1/creatives` reads; `PATCH` mutates;
|
|
10
|
+
* `POST /v1/creatives/{id}/render` substitutes macros and returns a tag URL.
|
|
11
|
+
*
|
|
12
|
+
* Format renders[] use the closed-shape `displayRender` / `parameterizedRender`
|
|
13
|
+
* pattern (codegen tightening from #1325) so adapter projection composes
|
|
14
|
+
* with `Format.renders[]` typed builders without `as` casts.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.CREATIVES = exports.FORMATS = exports.NETWORKS = exports.DEFAULT_API_KEY = void 0;
|
|
18
|
+
exports.projectFormat = projectFormat;
|
|
19
|
+
exports.DEFAULT_API_KEY = 'mock_creative_ad_server_key_do_not_use_in_prod';
|
|
20
|
+
exports.NETWORKS = [
|
|
21
|
+
{
|
|
22
|
+
network_code: 'net_creative_us',
|
|
23
|
+
display_name: 'Creative Ad Server — US Network',
|
|
24
|
+
adcp_publisher: 'creative-network.example',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
network_code: 'net_acmeoutdoor',
|
|
28
|
+
display_name: 'Acme Outdoor Creative Network',
|
|
29
|
+
adcp_publisher: 'acmeoutdoor.example',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
network_code: 'net_pinnacle',
|
|
33
|
+
display_name: 'Pinnacle Agency Creative Tenant',
|
|
34
|
+
adcp_publisher: 'pinnacle-agency.example',
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Format catalog — 6 base formats spanning display / video / CTV. Each
|
|
39
|
+
* is replicated across all networks (real ad servers do carry per-network
|
|
40
|
+
* format catalogs but most formats are inherited from the platform's
|
|
41
|
+
* default; modeling each network's full catalog as identical keeps the
|
|
42
|
+
* mock simple and matches the Innovid/GAM-creative pattern). The
|
|
43
|
+
* `snippet_template` is what the mock substitutes macros into when
|
|
44
|
+
* `POST /v1/creatives/{id}/render` is called.
|
|
45
|
+
*/
|
|
46
|
+
const BASE_FORMATS = [
|
|
47
|
+
{
|
|
48
|
+
format_id: 'display_300x250',
|
|
49
|
+
name: 'Display 300x250 (medrec)',
|
|
50
|
+
channel: 'display',
|
|
51
|
+
render_kind: 'fixed',
|
|
52
|
+
width: 300,
|
|
53
|
+
height: 250,
|
|
54
|
+
accepted_mimes: ['image/jpeg', 'image/png', 'image/webp', 'text/html'],
|
|
55
|
+
snippet_template: '<a href="{click_url}" target="_blank"><img src="{asset_url}" width="{width}" height="{height}"/></a><img src="{impression_pixel}" width="0" height="0"/>',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
format_id: 'display_728x90',
|
|
59
|
+
name: 'Display 728x90 (leaderboard)',
|
|
60
|
+
channel: 'display',
|
|
61
|
+
render_kind: 'fixed',
|
|
62
|
+
width: 728,
|
|
63
|
+
height: 90,
|
|
64
|
+
accepted_mimes: ['image/jpeg', 'image/png', 'image/webp', 'text/html'],
|
|
65
|
+
snippet_template: '<a href="{click_url}" target="_blank"><img src="{asset_url}" width="{width}" height="{height}"/></a><img src="{impression_pixel}" width="0" height="0"/>',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
format_id: 'video_30s',
|
|
69
|
+
name: 'Video 30s VAST',
|
|
70
|
+
channel: 'video',
|
|
71
|
+
render_kind: 'fixed',
|
|
72
|
+
duration_seconds: 30,
|
|
73
|
+
accepted_mimes: ['video/mp4', 'application/xml'],
|
|
74
|
+
snippet_template: '<VAST version="4.2"><Ad id="{creative_id}"><InLine><Creatives><Creative><Linear><Duration>00:00:{duration_seconds}</Duration><MediaFiles><MediaFile delivery="progressive" type="video/mp4">{asset_url}</MediaFile></MediaFiles><VideoClicks><ClickThrough>{click_url}</ClickThrough></VideoClicks></Linear></Creative></Creatives><Impression>{impression_pixel}</Impression></InLine></Ad></VAST>',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
format_id: 'video_15s',
|
|
78
|
+
name: 'Video 15s VAST',
|
|
79
|
+
channel: 'video',
|
|
80
|
+
render_kind: 'fixed',
|
|
81
|
+
duration_seconds: 15,
|
|
82
|
+
accepted_mimes: ['video/mp4', 'application/xml'],
|
|
83
|
+
snippet_template: '<VAST version="4.2"><Ad id="{creative_id}"><InLine><Creatives><Creative><Linear><Duration>00:00:{duration_seconds}</Duration><MediaFiles><MediaFile delivery="progressive" type="video/mp4">{asset_url}</MediaFile></MediaFiles><VideoClicks><ClickThrough>{click_url}</ClickThrough></VideoClicks></Linear></Creative></Creatives><Impression>{impression_pixel}</Impression></InLine></Ad></VAST>',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
format_id: 'ctv_30s',
|
|
87
|
+
name: 'CTV 30s VAST (1080p)',
|
|
88
|
+
channel: 'ctv',
|
|
89
|
+
render_kind: 'fixed',
|
|
90
|
+
duration_seconds: 30,
|
|
91
|
+
accepted_mimes: ['video/mp4'],
|
|
92
|
+
snippet_template: '<VAST version="4.2"><Ad id="{creative_id}"><InLine><Creatives><Creative><Linear><Duration>00:00:{duration_seconds}</Duration><MediaFiles><MediaFile delivery="progressive" type="video/mp4" width="1920" height="1080">{asset_url}</MediaFile></MediaFiles></Linear></Creative></Creatives><Impression>{impression_pixel}</Impression></InLine></Ad></VAST>',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
format_id: 'vast_30s',
|
|
96
|
+
name: 'VAST 30s (storyboard alias)',
|
|
97
|
+
channel: 'video',
|
|
98
|
+
render_kind: 'fixed',
|
|
99
|
+
duration_seconds: 30,
|
|
100
|
+
accepted_mimes: ['video/mp4', 'application/xml'],
|
|
101
|
+
snippet_template: '<VAST version="4.2"><Ad id="{creative_id}"><InLine><Creatives><Creative><Linear><Duration>00:00:{duration_seconds}</Duration><MediaFiles><MediaFile delivery="progressive" type="video/mp4">{asset_url}</MediaFile></MediaFiles><VideoClicks><ClickThrough>{click_url}</ClickThrough></VideoClicks></Linear></Creative></Creatives><Impression>{impression_pixel}</Impression></InLine></Ad></VAST>',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
format_id: 'display_responsive',
|
|
105
|
+
name: 'Display responsive (parameterized)',
|
|
106
|
+
channel: 'display',
|
|
107
|
+
render_kind: 'parameterized',
|
|
108
|
+
accepted_mimes: ['image/jpeg', 'image/png', 'image/webp'],
|
|
109
|
+
snippet_template: '<a href="{click_url}" target="_blank"><img src="{asset_url}" style="max-width:100%"/></a><img src="{impression_pixel}" width="0" height="0"/>',
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
/** Replicate base formats across every network for catalog lookups. */
|
|
113
|
+
exports.FORMATS = exports.NETWORKS.flatMap(net => BASE_FORMATS.map(f => ({ ...f, network_code: net.network_code })));
|
|
114
|
+
/**
|
|
115
|
+
* Seed creatives — 3 pre-loaded library entries the storyboard runner can
|
|
116
|
+
* read on `GET /v1/creatives` without first POSTing. Production would
|
|
117
|
+
* have an empty seed; these exist so the storyboard's `read-only` checks
|
|
118
|
+
* (list + filter) have something to return on a clean boot.
|
|
119
|
+
*/
|
|
120
|
+
exports.CREATIVES = [
|
|
121
|
+
{
|
|
122
|
+
creative_id: 'cr_seed_acme_medrec',
|
|
123
|
+
network_code: 'net_acmeoutdoor',
|
|
124
|
+
advertiser_id: 'adv_acmeoutdoor',
|
|
125
|
+
format_id: 'display_300x250',
|
|
126
|
+
name: 'Acme Outdoor — Summer Hero (300x250)',
|
|
127
|
+
snippet: '<a href="https://acmeoutdoor.example/summer" target="_blank"><img src="https://test-assets.adcontextprotocol.org/acme-outdoor/hero-300x250.jpg" width="300" height="250"/></a>',
|
|
128
|
+
status: 'active',
|
|
129
|
+
click_url: 'https://acmeoutdoor.example/summer',
|
|
130
|
+
created_at: '2026-04-01T00:00:00Z',
|
|
131
|
+
updated_at: '2026-04-01T00:00:00Z',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
creative_id: 'cr_seed_acme_leaderboard',
|
|
135
|
+
network_code: 'net_acmeoutdoor',
|
|
136
|
+
advertiser_id: 'adv_acmeoutdoor',
|
|
137
|
+
format_id: 'display_728x90',
|
|
138
|
+
name: 'Acme Outdoor — Summer Hero (728x90)',
|
|
139
|
+
snippet: '<a href="https://acmeoutdoor.example/summer" target="_blank"><img src="https://test-assets.adcontextprotocol.org/acme-outdoor/hero-728x90.jpg" width="728" height="90"/></a>',
|
|
140
|
+
status: 'active',
|
|
141
|
+
click_url: 'https://acmeoutdoor.example/summer',
|
|
142
|
+
created_at: '2026-04-01T00:00:00Z',
|
|
143
|
+
updated_at: '2026-04-01T00:00:00Z',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
creative_id: 'cr_seed_pinnacle_video',
|
|
147
|
+
network_code: 'net_pinnacle',
|
|
148
|
+
advertiser_id: 'adv_pinnacle',
|
|
149
|
+
format_id: 'video_30s',
|
|
150
|
+
name: 'Pinnacle Premium Q2 Preroll',
|
|
151
|
+
status: 'active',
|
|
152
|
+
created_at: '2026-04-01T00:00:00Z',
|
|
153
|
+
updated_at: '2026-04-01T00:00:00Z',
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
/**
|
|
157
|
+
* Project an upstream `MockFormat` to the closed-shape `Format` shape the
|
|
158
|
+
* mock surfaces on `GET /v1/formats`. Adapters consume this directly.
|
|
159
|
+
*
|
|
160
|
+
* Format.renders[] uses the closed-shape `displayRender` / `parameterizedRender`
|
|
161
|
+
* convention from #1325 — `dimensions: { width, height, unit }` for fixed,
|
|
162
|
+
* `accepts_parameters[]` for parameterized.
|
|
163
|
+
*/
|
|
164
|
+
function projectFormat(format, agentUrl) {
|
|
165
|
+
const baseFormat = {
|
|
166
|
+
format_id: { agent_url: agentUrl, id: format.format_id },
|
|
167
|
+
name: format.name,
|
|
168
|
+
};
|
|
169
|
+
if (format.render_kind === 'fixed') {
|
|
170
|
+
if (format.channel === 'display' && format.width !== undefined && format.height !== undefined) {
|
|
171
|
+
return {
|
|
172
|
+
...baseFormat,
|
|
173
|
+
renders: [
|
|
174
|
+
{
|
|
175
|
+
role: 'main',
|
|
176
|
+
dimensions: { width: format.width, height: format.height, unit: 'px' },
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if ((format.channel === 'video' || format.channel === 'ctv') && format.duration_seconds !== undefined) {
|
|
182
|
+
return {
|
|
183
|
+
...baseFormat,
|
|
184
|
+
renders: [
|
|
185
|
+
{
|
|
186
|
+
role: 'main',
|
|
187
|
+
dimensions: { width: 1920, height: 1080, unit: 'px' },
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Parameterized — adapter consumes accepts_parameters from format catalog
|
|
194
|
+
// separately; renders[] declares the role only.
|
|
195
|
+
return {
|
|
196
|
+
...baseFormat,
|
|
197
|
+
renders: [{ role: 'main', dimensions: { width: 0, height: 0, unit: 'px' } }],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=seed-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-data.js","sourceRoot":"","sources":["../../../../src/lib/mock-server/creative-ad-server/seed-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `creative-ad-server` upstream-shape mock-server. Stateful creative
|
|
3
|
+
* library (POST writes, GET reads), tag generation with macro substitution,
|
|
4
|
+
* synth delivery reporting. Closes #1459 (sub-issue of #1381).
|
|
5
|
+
*
|
|
6
|
+
* Pattern source:
|
|
7
|
+
* - Library state shape: `sales-guaranteed/server.ts` handleCreateCreative /
|
|
8
|
+
* handleListCreatives — network-scoped, idempotency on client_request_id.
|
|
9
|
+
* - Format catalog projection: `creative-template/server.ts` (templates
|
|
10
|
+
* in seed-data, projected at request-time).
|
|
11
|
+
*
|
|
12
|
+
* Specialism deltas vs `creative-template`:
|
|
13
|
+
* - Stateful library (writes persist across calls).
|
|
14
|
+
* - Format auto-detection from upload mime (handleCreateCreative).
|
|
15
|
+
* - Tag generation (POST /v1/creatives/{id}/render) substitutes macros
|
|
16
|
+
* into a stored snippet template — `{click_url}`, `{impression_pixel}`,
|
|
17
|
+
* `{cb}`, `{advertiser_id}`, etc.
|
|
18
|
+
* - Real `/serve/{creative_id}` HTML response — adopters get a true
|
|
19
|
+
* iframe-embeddable URL on previewCreative, not a synthetic string.
|
|
20
|
+
* - Delivery reporting (GET /v1/creatives/{id}/delivery) — synth
|
|
21
|
+
* impressions/clicks/CTR scaled by days-active, deterministic-seeded
|
|
22
|
+
* on (creative_id, day).
|
|
23
|
+
* - Multi-tenancy via X-Network-Code header (mirrors sales-guaranteed).
|
|
24
|
+
*/
|
|
25
|
+
import { projectFormat, type MockCreative, type MockFormat, type MockNetwork } from './seed-data';
|
|
26
|
+
export interface BootOptions {
|
|
27
|
+
port: number;
|
|
28
|
+
apiKey?: string;
|
|
29
|
+
networks?: MockNetwork[];
|
|
30
|
+
formats?: MockFormat[];
|
|
31
|
+
creatives?: MockCreative[];
|
|
32
|
+
}
|
|
33
|
+
export interface BootResult {
|
|
34
|
+
url: string;
|
|
35
|
+
close: () => Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export declare function bootCreativeAdServer(options: BootOptions): Promise<BootResult>;
|
|
38
|
+
export { projectFormat };
|
|
39
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/lib/mock-server/creative-ad-server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,EAKL,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAQD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA2dpF;AAsJD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|