@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.
Files changed (166) hide show
  1. package/bin/adcp.js +15 -3
  2. package/dist/lib/adapters/derived-account-store.d.ts +152 -0
  3. package/dist/lib/adapters/derived-account-store.d.ts.map +1 -0
  4. package/dist/lib/adapters/derived-account-store.js +135 -0
  5. package/dist/lib/adapters/derived-account-store.js.map +1 -0
  6. package/dist/lib/adapters/implicit-account-store.d.ts +3 -1
  7. package/dist/lib/adapters/implicit-account-store.d.ts.map +1 -1
  8. package/dist/lib/adapters/implicit-account-store.js +3 -1
  9. package/dist/lib/adapters/implicit-account-store.js.map +1 -1
  10. package/dist/lib/adapters/index.d.ts +1 -0
  11. package/dist/lib/adapters/index.d.ts.map +1 -1
  12. package/dist/lib/adapters/index.js +7 -1
  13. package/dist/lib/adapters/index.js.map +1 -1
  14. package/dist/lib/adapters/oauth-passthrough-resolver.d.ts +3 -1
  15. package/dist/lib/adapters/oauth-passthrough-resolver.d.ts.map +1 -1
  16. package/dist/lib/adapters/oauth-passthrough-resolver.js +3 -1
  17. package/dist/lib/adapters/oauth-passthrough-resolver.js.map +1 -1
  18. package/dist/lib/adapters/roster-account-store.d.ts +85 -24
  19. package/dist/lib/adapters/roster-account-store.d.ts.map +1 -1
  20. package/dist/lib/adapters/roster-account-store.js +52 -30
  21. package/dist/lib/adapters/roster-account-store.js.map +1 -1
  22. package/dist/lib/index.d.ts +3 -3
  23. package/dist/lib/index.d.ts.map +1 -1
  24. package/dist/lib/index.js +13 -8
  25. package/dist/lib/index.js.map +1 -1
  26. package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts +81 -0
  27. package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts.map +1 -0
  28. package/dist/lib/mock-server/creative-ad-server/seed-data.js +200 -0
  29. package/dist/lib/mock-server/creative-ad-server/seed-data.js.map +1 -0
  30. package/dist/lib/mock-server/creative-ad-server/server.d.ts +39 -0
  31. package/dist/lib/mock-server/creative-ad-server/server.d.ts.map +1 -0
  32. package/dist/lib/mock-server/creative-ad-server/server.js +618 -0
  33. package/dist/lib/mock-server/creative-ad-server/server.js.map +1 -0
  34. package/dist/lib/mock-server/index.d.ts.map +1 -1
  35. package/dist/lib/mock-server/index.js +180 -24
  36. package/dist/lib/mock-server/index.js.map +1 -1
  37. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts +66 -0
  38. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts.map +1 -0
  39. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js +193 -0
  40. package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js.map +1 -0
  41. package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts +33 -0
  42. package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts.map +1 -0
  43. package/dist/lib/mock-server/sales-non-guaranteed/server.js +782 -0
  44. package/dist/lib/mock-server/sales-non-guaranteed/server.js.map +1 -0
  45. package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts +50 -0
  46. package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts.map +1 -0
  47. package/dist/lib/mock-server/sponsored-intelligence/seed-data.js +133 -0
  48. package/dist/lib/mock-server/sponsored-intelligence/seed-data.js.map +1 -0
  49. package/dist/lib/mock-server/sponsored-intelligence/server.d.ts +13 -0
  50. package/dist/lib/mock-server/sponsored-intelligence/server.d.ts.map +1 -0
  51. package/dist/lib/mock-server/sponsored-intelligence/server.js +609 -0
  52. package/dist/lib/mock-server/sponsored-intelligence/server.js.map +1 -0
  53. package/dist/lib/protocols/mcp.d.ts.map +1 -1
  54. package/dist/lib/protocols/mcp.js +1 -41
  55. package/dist/lib/protocols/mcp.js.map +1 -1
  56. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  57. package/dist/lib/server/account-mode.d.ts +113 -0
  58. package/dist/lib/server/account-mode.d.ts.map +1 -0
  59. package/dist/lib/server/account-mode.js +125 -0
  60. package/dist/lib/server/account-mode.js.map +1 -0
  61. package/dist/lib/server/adcp-server.js +41 -0
  62. package/dist/lib/server/adcp-server.js.map +1 -1
  63. package/dist/lib/server/auth.d.ts +35 -0
  64. package/dist/lib/server/auth.d.ts.map +1 -1
  65. package/dist/lib/server/auth.js.map +1 -1
  66. package/dist/lib/server/create-adcp-server.d.ts +26 -9
  67. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  68. package/dist/lib/server/create-adcp-server.js +46 -20
  69. package/dist/lib/server/create-adcp-server.js.map +1 -1
  70. package/dist/lib/server/ctx-metadata/store.d.ts +1 -1
  71. package/dist/lib/server/ctx-metadata/store.d.ts.map +1 -1
  72. package/dist/lib/server/ctx-metadata/store.js +1 -0
  73. package/dist/lib/server/ctx-metadata/store.js.map +1 -1
  74. package/dist/lib/server/decisioning/account.d.ts +5 -0
  75. package/dist/lib/server/decisioning/account.d.ts.map +1 -1
  76. package/dist/lib/server/decisioning/account.js.map +1 -1
  77. package/dist/lib/server/decisioning/buyer-agent.d.ts +37 -4
  78. package/dist/lib/server/decisioning/buyer-agent.d.ts.map +1 -1
  79. package/dist/lib/server/decisioning/buyer-agent.js +12 -2
  80. package/dist/lib/server/decisioning/buyer-agent.js.map +1 -1
  81. package/dist/lib/server/decisioning/compose.d.ts +33 -2
  82. package/dist/lib/server/decisioning/compose.d.ts.map +1 -1
  83. package/dist/lib/server/decisioning/compose.js +13 -46
  84. package/dist/lib/server/decisioning/compose.js.map +1 -1
  85. package/dist/lib/server/decisioning/index.d.ts +2 -1
  86. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  87. package/dist/lib/server/decisioning/index.js +2 -1
  88. package/dist/lib/server/decisioning/index.js.map +1 -1
  89. package/dist/lib/server/decisioning/platform-helpers.d.ts +18 -0
  90. package/dist/lib/server/decisioning/platform-helpers.d.ts.map +1 -1
  91. package/dist/lib/server/decisioning/platform-helpers.js +20 -0
  92. package/dist/lib/server/decisioning/platform-helpers.js.map +1 -1
  93. package/dist/lib/server/decisioning/platform.d.ts +19 -21
  94. package/dist/lib/server/decisioning/platform.d.ts.map +1 -1
  95. package/dist/lib/server/decisioning/platform.js.map +1 -1
  96. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
  97. package/dist/lib/server/decisioning/runtime/from-platform.js +334 -44
  98. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  99. package/dist/lib/server/decisioning/runtime/observed-modes.d.ts +40 -0
  100. package/dist/lib/server/decisioning/runtime/observed-modes.d.ts.map +1 -0
  101. package/dist/lib/server/decisioning/runtime/observed-modes.js +82 -0
  102. package/dist/lib/server/decisioning/runtime/observed-modes.js.map +1 -0
  103. package/dist/lib/server/decisioning/runtime/protocol-for-tool.js +2 -2
  104. package/dist/lib/server/decisioning/runtime/protocol-for-tool.js.map +1 -1
  105. package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -1
  106. package/dist/lib/server/decisioning/runtime/validate-platform.js +9 -1
  107. package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -1
  108. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts +125 -0
  109. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts.map +1 -0
  110. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js +52 -0
  111. package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js.map +1 -0
  112. package/dist/lib/server/decisioning/tenant-registry.d.ts +16 -0
  113. package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -1
  114. package/dist/lib/server/decisioning/tenant-registry.js.map +1 -1
  115. package/dist/lib/server/index.d.ts +4 -1
  116. package/dist/lib/server/index.d.ts.map +1 -1
  117. package/dist/lib/server/index.js +9 -3
  118. package/dist/lib/server/index.js.map +1 -1
  119. package/dist/lib/server/serve.js +20 -2
  120. package/dist/lib/server/serve.js.map +1 -1
  121. package/dist/lib/server/test-controller.d.ts +3 -0
  122. package/dist/lib/server/test-controller.d.ts.map +1 -1
  123. package/dist/lib/server/test-controller.js +23 -20
  124. package/dist/lib/server/test-controller.js.map +1 -1
  125. package/dist/lib/testing/comply-controller.d.ts +23 -2
  126. package/dist/lib/testing/comply-controller.d.ts.map +1 -1
  127. package/dist/lib/testing/comply-controller.js +19 -2
  128. package/dist/lib/testing/comply-controller.js.map +1 -1
  129. package/dist/lib/testing/index.d.ts +1 -1
  130. package/dist/lib/testing/index.d.ts.map +1 -1
  131. package/dist/lib/testing/index.js.map +1 -1
  132. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  133. package/dist/lib/testing/storyboard/validations.js +36 -54
  134. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  135. package/dist/lib/testing/test-controller.d.ts +10 -4
  136. package/dist/lib/testing/test-controller.d.ts.map +1 -1
  137. package/dist/lib/testing/test-controller.js +9 -3
  138. package/dist/lib/testing/test-controller.js.map +1 -1
  139. package/dist/lib/types/index.d.ts +3 -2
  140. package/dist/lib/types/index.d.ts.map +1 -1
  141. package/dist/lib/types/index.js +3 -0
  142. package/dist/lib/types/index.js.map +1 -1
  143. package/dist/lib/utils/glob.d.ts +4 -2
  144. package/dist/lib/utils/glob.d.ts.map +1 -1
  145. package/dist/lib/utils/glob.js +4 -2
  146. package/dist/lib/utils/glob.js.map +1 -1
  147. package/dist/lib/version.d.ts +3 -3
  148. package/dist/lib/version.js +3 -3
  149. package/docs/llms.txt +2 -2
  150. package/examples/README.md +29 -13
  151. package/examples/hello-cluster.ts +62 -23
  152. package/examples/hello_creative_adapter_ad_server.ts +790 -0
  153. package/examples/hello_seller_adapter_guaranteed.ts +80 -22
  154. package/examples/hello_seller_adapter_non_guaranteed.ts +1020 -0
  155. package/examples/hello_si_adapter_brand.ts +572 -0
  156. package/package.json +3 -2
  157. package/skills/build-creative-agent/SKILL.md +103 -183
  158. package/skills/build-generative-seller-agent/SKILL.md +15 -9
  159. package/skills/build-governance-agent/SKILL.md +20 -11
  160. package/skills/build-retail-media-agent/SKILL.md +10 -8
  161. package/skills/build-seller-agent/SKILL.md +15 -13
  162. package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +9 -31
  163. package/skills/build-si-agent/SKILL.md +251 -196
  164. package/skills/build-signals-agent/SKILL.md +2 -0
  165. package/skills/call-adcp-agent/SKILL.md +7 -1
  166. 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"}